R: Как вывести столбец на основе одной и той же формулы для каждого входного столбца?

#r #dplyr #data.table

#r #dplyr #data.table

Вопрос:

В последнем пакете DataFramesMeta.jl для Julia можно сделать

 x = [:x1, :x2]
n = [:n1, :n2]
@transform(df, cols(x) = :y .  cols(n))
  

и он будет выводить столбцы x1 = y x1 и x2 = y x2 .

Вопрос, как лучше всего сделать это в R элегантно? Я могу сделать это так

 library(dplyr)
df = data.frame(y = 1:3, n1 = 1:3, n2 = 1:3)

x = c("m1", "m2")
n = c("n1", "n2")

code = glue::glue_data(list(x=x, n=n), "{x}=y {n}")
code = glue::glue("vars({paste(code, collapse=',')})")

mutate(df, !!!eval(parse(text=code)))
  

или в базе

 res = lapply(n, function(n) {
  df$y   df[, n]
}) %>% data.frame

names(res) <- x

df = cbind(df, res)
  

Но это кажется хакерским. data.table и приветствуются базовые решения.

Ответ №1:

Вы можете сделать :

 df[x] <- lapply(df[n], function(p) df$y   p)
df
#  y n1 n2 m1 m2
#1 1  1  1  2  2
#2 2  2  2  4  4
#3 3  3  3  6  6
  

Аналогично с purrr::map :

 df[x] <- purrr::map(df[n], ~df$y   .x)
  

и data.table :

 library(data.table)
setDT(df)[, (x):= lapply(.SD, function(p) p   y), .SDcols = n]
  

Позднее мы поняли, что нам не нужно какое-либо семейство функций apply, мы можем сделать это напрямую.

 df[x] <- df[n]   df$y
  

Комментарии:

1. Вариация на тему — df[x] <- Map(" ", df["y"], df[n])

2. Я только что понял, что нам не нужны какие apply.* -либо here . df[x] <- df[n] df$y должно работать правильно?

3. Действительно, хотя на самом деле я полагаю , что функция может быть намного сложнее.

Ответ №2:

Мы можем использовать sweep

 df[x] <- sweep(df[n], 1, df$y, FUN = ` `)