data.table生成多个列并对它们进行汇总

时间:2015-07-25 03:30:26

标签: r data.table

我正在尝试学习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等聪明的解决方案可能会使这个问题吸引更广泛的读者。

2 个答案:

答案 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)
相关问题