我正在尝试学习data.table语法。我有大多数简单总结的基础知识,但我没有得到如何使用data.table从现有列生成新列并进行总结。
这是一个MWE示例,我使用dplyr和基础工具从一个列生成多个列,并通过对变量进行分组来总结:
当前输入
## fact1 fact2 X0
## 1 b 2 9
## 2 a 2 6
## 3 b 1 7
## 4 c 2 3
## 5 a 1 8
## 6 a 1 4
## 7 a 1 5
## 8 a 1 1
## 9 b 1 2
## 10 b 2 10
Base + dlyr Code
set.seed(10)
dat <- data.frame(
fact1 = factor(sample(c('a', 'b', 'c'), 10, TRUE)),
fact2 = factor(sample(1:2, 10, TRUE)),
X0 = sample(1:10, 10)
)
add <- function(x, y) x + y
z <- sample(1:10, 6, FALSE)
library(dplyr)
z %>%
lapply(., add, dat[, 'X0']) %>%
do.call(cbind, .) %>%
cbind(dat, .) %>%
data.frame() %>%
group_by(fact1, fact2) %>%
summarise_each(funs(sum))
所需的输出
## Source: local data frame [5 x 9]
## Groups: fact1
##
## fact1 fact2 X0 X1 X2 X3 X4 X5 X6
## 1 a 1 18 42 22 26 46 30 34
## 2 a 2 6 12 7 8 13 9 10
## 3 b 1 9 21 11 13 23 15 17
## 4 b 2 19 31 21 23 33 25 27
## 5 c 2 3 9 4 5 10 6 7
虽然我要求一个data.table特定的解决方案,但我认为看到基础和dplyr等聪明的解决方案可能会使这个问题吸引更广泛的读者。
答案 0 :(得分:3)
可能有更好的方法
library(data.table)
setDT(dat)[, paste0("X", 1:6):= lapply(z, add, X0),
][, lapply(.SD, sum), by = .(fact1, fact2)]
# fact1 fact2 X0 X1 X2 X3 X4 X5 X6
# 1: b 2 19 31 21 23 33 25 27
# 2: a 2 6 12 7 8 13 9 10
# 3: b 1 9 21 11 13 23 15 17
# 4: c 2 3 9 4 5 10 6 7
# 5: a 1 18 42 22 26 46 30 34
答案 1 :(得分:2)
base R
选项
dat[paste0('X', 1:6)] <- Map(add, list(dat$X0), z)
aggregate(.~fact1+fact2, dat, FUN=sum)
# fact1 fact2 X0 X1 X2 X3 X4 X5 X6
#1 a 1 18 42 22 26 46 30 34
#2 b 1 9 21 11 13 23 15 17
#3 a 2 6 12 7 8 13 9 10
#4 b 2 19 31 21 23 33 25 27
#5 c 2 3 9 4 5 10 6 7
或者只需一步
aggregate(.~fact1+fact2, cbind(dat, mapply(add, list(dat$X0), z)), FUN=sum)