r - 如何创建均值和标准差data.table中的列

标签 r data.table mean calculated-columns

下面的代码/结果使我感到困惑,为什么data.table对于均值函数而不是sd函数返回NA。

library(data.table)
test <- data.frame('id'=c(1,2,3,4,5),
                   'A'=seq(2,9,length=5),
                   'B'=seq(3,9,length=5),
                   'C'=seq(4,9,length=5),
                   'D'=seq(5,9,length=5))

test <- as.data.table(test)

test[,`:=`(mean_test = mean(.SD), sd_test = sd(.SD)),by=id,.SDcols=c('A','B','C','D')]
> test
   id    A   B    C    D mean_test   sd_test
   1:  1 2.00 3.0 4.00 5        NA 1.2909944
   2:  2 3.75 4.5 5.25 6        NA 0.9682458
   3:  3 5.50 6.0 6.50 7        NA 0.6454972
   4:  4 7.25 7.5 7.75 8        NA 0.3227486
   5:  5 9.00 9.0 9.00 9        NA 0.0000000

通过DT教程/示例,我已经学习了很多内容。 This问题与我希望做的事情非常相似。

为什么标准偏差函数起作用,而平均值函数返回NA?

编辑:使用Ricardo Saporta的解决方案:
test[,`:=`(mean_test = apply(.SD, 1, mean), sd_test = apply(.SD, 1, sd),by=id,.SDcols=c('A','B','C','D')]

> test
   id    A   B    C D mean_test   sd_test
1:  1 2.00 3.0 4.00 5     3.500 1.2909944
2:  2 3.75 4.5 5.25 6     4.875 0.9682458
3:  3 5.50 6.0 6.50 7     6.250 0.6454972
4:  4 7.25 7.5 7.75 8     7.625 0.3227486
5:  5 9.00 9.0 9.00 9     9.000 0.0000000

最佳答案

.SD本身就是data.table因此,当您使用mean(.SD)时,您(正在尝试)采用整个data.table的均值。

函数mean()不知道如何处理data.table并返回NA
看一看

## the .SD in your question is the same as 
test[, c('A','B','C','D')]

## try taking its mean
mean(test[, c('A','B','C','D')])

# Warning in mean.default(test[, c("A", "B", "C", "D")]) :
#   argument is not numeric or logical: returning NA
# [1] NA

试试这个代替

使用lapply(.SD, mean)逐列
apply(.SD, 1, mean)逐行

关于r - 如何创建均值和标准差data.table中的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25535573/

相关文章:

Python/Pandas - 组合 groupby 均值和最小值

r - 使用mapply计算多个列表的均值

r - RStan 会在 super 计算机上运行吗?

Perl Statistics::R 生成空白绘图图像 (jpeg)

R:自动在文本前后添加引号

r - 查找 data.table 中之前出现的较大事件

matlab - 沿第 3 个维度平均每 4 个条目

r - 跳过 R 中的特定行和列

当列名在别处预定义时,R data.table 在条件子集设置方面苦苦挣扎

r - 使用变量对 data.table 进行子集化(当 varname 与 colname 相同时)