找到列表中矢量的均值和标准差

时间:2016-04-05 03:39:30

标签: r list

ITEM

我想计算TRIAL1的每个ITEM1的平均值和标准差。问题是我希望将99的所有条目都视为0.例如:对于TRIAL1sum = Reduce("+",lapply(list, function(x) {x[2,][x[1,]!=0] <- 0; replace(x, which(x==99), 0)})) mean = sum/length(list) 值为0,0,0,0和0(因为我想设置99 = 0)。因此均值为0,标准差也为0.

ITEM

这为我提供了每个{{1}}的方法。但是如何计算标准偏差呢?

1 个答案:

答案 0 :(得分:0)

基于OP代码进行初始处理后的一个选项(即replace 99为0),将rbind list改为matrix(' m1'),然后使用colSds在按行名称进行子集化后获取每个“ITEM”的标准偏差。

library(matrixStats)
m1 <- do.call(rbind,lapply(data, function(x) {
       x[2,][x[1,]!=0] <- 0
      replace(x, which(x==99), 0)}))
colSds(m1[c(TRUE, FALSE),])
colSds(m1[c(FALSE, TRUE),])

如果有许多唯一的行名称,最好按行名称split,然后执行colSds

t(sapply(split(1:nrow(m1), row.names(m1)),
                    function(i) colSds(m1[i,])))

或者另一种选择是将list转换为data.table,使用list使用rbindlist,逐行名称('rn')转换,我们循环播放“ITEM”列并获取sd

library(data.table)
dt <- rbindlist(lapply(data, function(x) {
             x[2,][x[1,]!=0] <- 0
             x <- replace(x, which(x==99), 0)
             setDT(as.data.frame(x), keep.rownames=TRUE)}))
dt[, lapply(.SD, sd), by = rn]
     rn     ITEM1    ITEM2    ITEM3     ITEM4    ITEM6     ITEM7 ITEM8
#1:   TRIAL1 0.0000000 1.341641 1.095445 0.4472136 1.341641 0.8944272     0
#2: severity 0.4472136 0.000000 0.000000 0.0000000 0.000000 0.0000000     0

如果我们在一次通话中同时需要meansd

dt[, unlist(lapply(.SD, function(x) list(mean(x), 
                sd(x))), recursive=FALSE), by = rn]

可以使用base R

aggregate中复制上述方法
d1 <- data.frame(rn = row.names(m1), `row.names<-`(m1, NULL))
aggregate(.~rn, d1, sd)
#        rn     ITEM1    ITEM2    ITEM3     ITEM4    ITEM6     ITEM7 ITEM8
#1 severity 0.4472136 0.000000 0.000000 0.0000000 0.000000 0.0000000     0
#2   TRIAL1 0.0000000 1.341641 1.095445 0.4472136 1.341641 0.8944272     0

适用于meansd

do.call(data.frame,aggregate(.~rn, d1, 
         function(x) c(mean(x), sd(x))))