假设我有以下数据框:
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)])
}))
除非不起作用。
我该怎么做?
答案 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
无法将列表作为参数