我的数据框在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函数,但无法弄清楚它是如何工作的。
答案 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)