如何在data.table中创建mean和sd列

nfm*_*ure 6 r calculated-columns mean data.table

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

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
Run Code Online (Sandbox Code Playgroud)

我已经学习了很多东西,通过DT教程/示例. 这个问题与我希望做的非常相似.

为什么标准差函数有效,平均函数返回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
Run Code Online (Sandbox Code Playgroud)

Ric*_*rta 12

.SD本身就是一个data.table
因此,当你带走mean(.SD)(尝试)取整个数据的平均值时

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

看一看

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

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

# Warning in mean.default(test[, c("A", "B", "C", "D"), with = FALSE]) :
#   argument is not numeric or logical: returning NA
# [1] NA
Run Code Online (Sandbox Code Playgroud)

试试这个

采用lapply(.SD, mean) 了逐列或 apply(.SD, 1, mean)进行行


Dav*_*urg 8

您可以mean通过使用rowMeans代替工作,从而避免使用apply(类似于链接的问题)

test[,`:=`(mean_test = rowMeans(.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     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
Run Code Online (Sandbox Code Playgroud)