标准偏差取决于变量

时间:2016-03-24 11:05:43

标签: r

我的数据框在R中看起来像这样(但更大):

| ?- Tree = tree(2, +, 3), Tree = tree(L, Op, R).

L = 2
Op = (+)
R = 3
Tree = tree(2,+,3)

yes
| ?- Tree = tree(2,+,tree(3,*,4)), Tree = tree(L, Op, R).

L = 2
Op = (+)
R = tree(3,*,4)
Tree = tree(2,+,tree(3,*,4))

yes

| ?- Tree = tree(2,+,tree(3,*,4)), Tree = tree(L, Op, R), R = tree(LR, OpR, RR).

L = 2
LR = 3
Op = (+)
OpR = (*)
R = tree(3,*,4)
RR = 4
Tree = tree(2,+,tree(3,*,4))

yes
| ?-

我想为每个研究中的每次运行计算每个柱的标准偏差(在这种情况下只是x和y),每个研究的sd,最后是整个柱的sd。有点令人困惑的解释,但在这种情况下,它将是(在x上)的sd:

x<-c(1,2,3,4,5,6)
y<-c(2,5,3,4,9,63)
run<-c(1,1,2,2,1,1)
studie<-c("stu1","stu1","stu1","stu1","stu2","stu2")
df<-data.frame(x,y,run,studie)

我认为我应该使用apply函数,但无法弄清楚它是如何工作的。

3 个答案:

答案 0 :(得分:3)

在基数R中,您可以使用aggregate(),然后使用sapply()

aggregate(cbind(x,y)~run+studie,df,sd);
##   run studie         x          y
## 1   1   stu1 0.7071068  2.1213203
## 2   2   stu1 0.7071068  0.7071068
## 3   1   stu2 0.7071068 38.1837662
aggregate(cbind(x,y)~studie,df,sd);
##   studie         x         y
## 1   stu1 1.2909944  1.290994
## 2   stu2 0.7071068 38.183766
sapply(df[c('x','y')],sd);
##         x         y
##  1.870829 23.963862

另外,如果您想要参数化目标列(需要使用aggregate()的非公式接口):

vars <- c('x','y');
aggregate(df[vars],df[c('run','studie')],sd);
##   run studie         x          y
## 1   1   stu1 0.7071068  2.1213203
## 2   2   stu1 0.7071068  0.7071068
## 3   1   stu2 0.7071068 38.1837662
aggregate(df[vars],df['studie'],sd);
##   studie         x         y
## 1   stu1 1.2909944  1.290994
## 2   stu2 0.7071068 38.183766
sapply(df[vars],sd);
##         x         y
##  1.870829 23.963862

答案 1 :(得分:1)

我们可以使用data.table

library(data.table)
setDT(df)[, .(Sd= sd(x)) , by = .(studie, run)]

并且对于这两列,在将lapply指定为&#39; x&#39;之后使用.SDcols。并且&#39; y&#39;。

setDT(df)[, lapply(.SD, sd), by = .(studie, run), .SDcols = x:y]

答案 2 :(得分:0)

关于studie进行分组并运行

 library(dplyr)
 df %>% group_by(studie,run) %>% summarise(Sd= sd(x))

关于studie的分组

df %>% group_by(studie) %>% summarise(Sd= sd(x))

对于所有列

sd(df$x)