3

假设我有以下数据框:

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)]) 
                            }))

除了那行不通。

我该怎么做呢?

4

2 回答 2

5

您也可以使用Reducewith +,尽管这不会有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
于 2013-04-09T04:28:32.647 回答
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不能将列表作为参数

于 2013-04-09T04:16:10.210 回答