我有一个数据框,我想计算三列中因子分组的观测标准误差。使用tapply:
,这样计算了组平均值的标准偏差和标准误差aveResponse <- tapply(df$Response, col1:col2:col3, mean, na.rm=T)
aveSD <- tapply(df$Response, col1:col2:col3, sd, na.rm=T)
stderr <- function(x) sqrt(var(x,na.rm=TRUE)/(length(na.omit(x)))
aveSEM <- tapply(df$Response, col1:col2:col3, stderr, na.rm=T)
我之前已经计算了各个观测值的标准偏差(保存在colSD列中),并且想要计算相应的标准误差。使用下面的函数,我可以得到标准错误:
stderr <- function(x) x/sqrt(length(na.omit(x)))
SEM<- tapply(df$colSD, col1:col2:col3, stderr)
但是,结果以数组形式给出,每个组中的n个观察结果为每个位置的字符串(我认为)。任何想法如何进一步移动,通过改变功能,使用另一个函数或将数组转换为向量,其中每个观察的标准误差有自己的位置?
一个小样本(如果我通过dput(df),你更容易使用吗?):
>df
col1 col2 col3 Response colSD
1 food1 tissue1 gene1 1.644 0.080
2 food1 tissue1 gene1 1.726 0.093
3 food1 tissue2 gene1 0.088 0.014
4 food1 tissue2 gene1 0.002 0.000
5 food2 tissue1 gene1 0.311 0.012
6 food2 tissue1 gene1 0.657 0.265
7 food2 tissue2 gene1 0.000 0.000
8 food2 tissue2 gene1 0.001 0.000
9 food1 tissue1 gene2 3.223 0.246
10 food1 tissue1 gene2 2.156 0.440
11 food1 tissue2 gene2 0.279 0.200
12 food1 tissue2 gene2 0.033 0.007
13 food2 tissue1 gene2 0.044 0.002
14 food2 tissue1 gene2 0.265 0.117
15 food2 tissue2 gene2 0.000 0.000
16 food2 tissue2 gene2 0.000 0.000
我想计算每个观察的标准误差,例如0.080/sqrt(2)
,0.093/sqrt(2)
等,并将结果作为附加列添加到数据框中:
>df
col1 col2 col3 Response colSD colSEM
1 food1 tissue1 gene1 1.644 0.080 0.057
2 food1 tissue1 gene1 1.726 0.093 0.066 etc...
答案 0 :(得分:2)
您可以使用ddply
获得非常紧凑的解决方案:
library(plyr)
df <- ddply(df, .(col1, col2, col3), transform, colSEM = colSD/sqrt(length(na.omit(colSD))))
对于那些对此解决方案如何发展感兴趣的人,请查看编辑历史记录。