ITEM
我想计算TRIAL1
的每个ITEM1
的平均值和标准差。问题是我希望将99的所有条目都视为0.例如:对于TRIAL1
,sum = 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}}的方法。但是如何计算标准偏差呢?
答案 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
如果我们在一次通话中同时需要mean
和sd
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
适用于mean
和sd
do.call(data.frame,aggregate(.~rn, d1,
function(x) c(mean(x), sd(x))))