Назначьте несколько столбцов, используя:= in data.таблица, по группам
каков наилучший способ назначить несколько столбцов с помощью data.table
? Например:
f <- function(x) {c("hi", "hello")}
x <- data.table(id = 1:10)
Я хотел бы сделать что-то вроде этого (конечно, этот синтаксис неверен):
x[ , (col1, col2) := f(), by = "id"]
и чтобы расширить это, у меня может быть много столбцов с именами, хранящимися в переменной (скажем col_names
) и я хотел бы сделать:
x[ , col_names := another_f(), by = "id", with = FALSE]
Как правильно сделать что-то подобное?
2 ответа:
Это теперь работает в v1.8.3 на R-Forge. Спасибо, что выделили его!
x <- data.table(a = 1:3, b = 1:6) f <- function(x) {list("hi", "hello")} x[ , c("col1", "col2") := f(), by = a][] # a b col1 col2 # 1: 1 1 hi hello # 2: 2 2 hi hello # 3: 3 3 hi hello # 4: 1 4 hi hello # 5: 2 5 hi hello # 6: 3 6 hi hello x[ , c("mean", "sum") := list(mean(b), sum(b)), by = a][] # a b col1 col2 mean sum # 1: 1 1 hi hello 2.5 5 # 2: 2 2 hi hello 3.5 7 # 3: 3 3 hi hello 4.5 9 # 4: 1 4 hi hello 2.5 5 # 5: 2 5 hi hello 3.5 7 # 6: 3 6 hi hello 4.5 9 mynames = c("Name1", "Longer%") x[ , (mynames) := list(mean(b) * 4, sum(b) * 3), by = a] # a b col1 col2 mean sum Name1 Longer% # 1: 1 1 hi hello 2.5 5 10 15 # 2: 2 2 hi hello 3.5 7 14 21 # 3: 3 3 hi hello 4.5 9 18 27 # 4: 1 4 hi hello 2.5 5 10 15 # 5: 2 5 hi hello 3.5 7 14 21 # 6: 3 6 hi hello 4.5 9 18 27
x[ , mynames := list(mean(b) * 4, sum(b) * 3), by = a, with = FALSE][] # same # a b col1 col2 mean sum Name1 Longer% # 1: 1 1 hi hello 2.5 5 10 15 # 2: 2 2 hi hello 3.5 7 14 21 # 3: 3 3 hi hello 4.5 9 18 27 # 4: 1 4 hi hello 2.5 5 10 15 # 5: 2 5 hi hello 3.5 7 14 21 # 6: 3 6 hi hello 4.5 9 18 27 x[ , get("mynames") := list(mean(b) * 4, sum(b) * 3), by = a][] # same # a b col1 col2 mean sum Name1 Longer% # 1: 1 1 hi hello 2.5 5 10 15 # 2: 2 2 hi hello 3.5 7 14 21 # 3: 3 3 hi hello 4.5 9 18 27 # 4: 1 4 hi hello 2.5 5 10 15 # 5: 2 5 hi hello 3.5 7 14 21 # 6: 3 6 hi hello 4.5 9 18 27 x[ , eval(mynames) := list(mean(b) * 4, sum(b) * 3), by = a][] # same # a b col1 col2 mean sum Name1 Longer% # 1: 1 1 hi hello 2.5 5 10 15 # 2: 2 2 hi hello 3.5 7 14 21 # 3: 3 3 hi hello 4.5 9 18 27 # 4: 1 4 hi hello 2.5 5 10 15 # 5: 2 5 hi hello 3.5 7 14 21 # 6: 3 6 hi hello 4.5 9 18 27
следующая стенографическая запись может быть полезной. Все кредиты идут на Эндрю Брукс, конкретно эта статья.
dt[,`:=`(avg=mean(mpg), med=median(mpg), min=min(mpg)), by=cyl]