r - 对特定列的 data.table 行求和

标签 r data.table

我有一个大数据表(来自包 data.table),有超过 60 列(前三列对应于因子,其余对应于响应变量,在这种情况下是不同的物种)和几行对应于不同的处理水平和物种丰度。
一个非常小的版本如下所示:

library(data.table)
TEST <- data.table(Time=c("0","0","0","7","7","7","12"),
             Zone=c("1","1","0","1","0","0","1"),
             quadrat=c(1,2,3,1,2,3,1),
             Sp1=c(0,4,29,9,1,2,10),
             Sp2=c(20,17,11,15,32,15,10),
             Sp3=c(1,0,1,1,1,1,0))

setkey(TEST,Time)
TEST

#    Time Zone quadrat Sp1 Sp2 Sp3
# 1:    0    1       1   0  20   1
# 2:    0    1       2   4  17   0
# 3:    0    0       3  29  11   1
# 4:   12    1       1  10  10   0
# 5:    7    1       1   9  15   1
# 6:    7    0       2   1  32   1
# 7:    7    0       3   2  15   1

我首先想计算每个区域 x 样方组合在时间上每个物种的平均丰度,这很好:
Abundance = TEST[ , lapply(.SD, mean), by = "Zone,quadrat"]
Abundance
#    Zone quadrat Time       Sp1  Sp2       Sp3
# 1:   Z1       1   NA  6.333333 15.0 0.6666667
# 2:   Z1       2   NA  2.500000 24.5 0.5000000
# 3:   Z0       1   NA 15.500000 13.0 1.0000000  

然后我想计算“物种”列的逐行总和,在从 Sp1 到 Sp3 的示例中。我尝试了以下代码但没有成功:
Abundance$SumAbundance <- rowSums(Abundance[ , c(4:6)])  

我收到错误消息:
# Error in rowSums(Abundance[, c(4:6)]) : 
# 'x' must be an array of at least two dimensions

如何计算 data.table 的特定列的行总和?

最佳答案

[ 于 2020 年 2 月 15 日编辑以反射(reflect) data.table 的当前状态 ] 在 data.table 的最新版本中rowSums(Abundance[ , 4:6])像 OP 最初预期的那样工作。以下是一些替代方案:

Abundance[, SumAbundance := rowSums(.SD), .SDcols = 4:6]

另外,我没有检查,但我怀疑这会更快,因为它不会转换为 matrixrowSums做:
Abundance[, SumAbundance := Reduce(`+`, .SD), .SDcol = 4:6]

关于r - 对特定列的 data.table 行求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21857679/

相关文章:

r - bookdown 中 tikz 用法的最小工作示例?

python - 了解神经网络在文档示例 (MNIST) 中到底预测什么

r - 使用 p 值的逐步回归删除 p 值不显着的变量

r - 根据另一列中的值和分组创建一个新的 r data.table 列

r - 使用条件将数据从一个表子集到不同的表中

r - 从文本中提取数据的最有效方法

r - 来自 data.table::frollmean() 的意外高内存使用

r - 如何为 bool 矩阵构建类似填字游戏的图

R - Spatstat - 使用数据表按 ID 搜索最近邻

r - 将 R data.table 插入/更新到 PostgreSQL 表中