#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 = ` `)