以编程方式对数据框的列进行求和?

时间:2013-04-09 04:03:32

标签: r

假设我有以下数据框:

dd <- data.frame(x1 = c(1, 2, 3), x2 = c(3, 4, 5), x3 = (5, 6, 7))

我想创建一个新列,如下所示:

dd$x.sum <- dd$x1 + dd$x2 + dd$x3

但不是写出添加(假设我实际上有100列x1, x2, ..., x100我想要总结),我想以编程方式编写它。类似的东西:

dd$x.sum <- sum(sapply(1:3, function(i) { 
                              return(dd[paste0("x", i)]) 
                            }))

除非不起作用。

我该怎么做?

2 个答案:

答案 0 :(得分:5)

您也可以将Reduce+一起使用,但这不会有na.rm参数

dd <- data.frame(matrix(runif(1e6),ncol=1000))

dd$sum <-     Reduce('+', dd[paste0('X',seq_len(1000))])


# some benchmarking
xx <- paste0("X", seq_len(1000))
library(microbenchark)
microbenchmark(Reduce('+', dd[xx]), rowSums(dd[xx]))
## Unit: milliseconds
##                expr      min       lq   median       uq      max neval
## Reduce("+", dd[xx]) 14.93642 15.19713 15.56077 15.78606 31.92162   100
##    rowSums(dd[xx]) 30.79629 31.44574 31.67192 32.14342 58.07938   100

答案 1 :(得分:1)

无需迭代:

dd$sum <- rowSums(dd[paste0("x", 1:3)])

但是,如果你想迭代,你可以自己完成索引:

dd$sum <-  rowSums(sapply(paste0("x", 1:3), function(ind) dd[[ind]]))

sum(sapply(...))语句无法正常工作的原因是因为sapply正在返回列表,sum无法将列表作为参数