2014-01-27 29 views
2

我试图到SD功能应用到我的数据帧,但它不工作:应用标准偏差的因素数据帧分割

sdsd <- by(nowna[, 1:16], nowna$stamm, sd) 
Error in FUN(X[[1L]], ...) : could not find function "FUN" 

你有任何想法,为什么?

非常感谢。

+0

你可以标记你的问题的回答,如果它确实已经回答了。 – RUser

回答

5
library(plyr) 
dt <- data.frame(age=rchisq(20,10),group=sample(1:2,20,rep=T)) 

dt 
age group 
1 9.908015  2 
2 11.415043  2 
3 7.849433  2 
4 8.850696  2 
5 6.194783  2 
6 11.111339  2 
7 9.789127  2 
8 10.844352  1 
9 8.686503  2 
10 21.579142  2 
11 11.750417  1 
12 3.719226  1 
13 12.086820  1 
14 13.562351  1 
15 4.636543  2 
16 12.648083  1 
17 10.780387  2 
18 10.651318  2 
19 5.976533  1 
20 13.546345  2 

ddply(dt,~group,summarise,mean=mean(age),sd=sd(age)) 
group  mean  sd 
1  1 10.08397 3.728750 
2  2 10.38451 4.082198 

另一种使用新包装的单线变体data.table

dtf <- data.frame(age=rchisq(100000,10),group=factor(sample(1:10,100000,rep=T))) 
dt <- data.table(dt) 
dt[,list(mean=mean(age),sd=sd(age)),by=group] 

使用Aggregate Function

aggregate(dt$age, by=list(dt$group), FUN=sd) 
    Group.1  x 
1  1 3.728750 
2  2 4.082198 
1

如果要计算多个列的标准偏差,您可以使用aggregate

aggregate(nowna[1:16], list(nowna$stamm), sd) 
0

sd(nowna[,1:16])可能不会工作。这将工作:

apply(nowna[,1:16], 2, function(x) by(x, nowna$stamm, sd)) 
1

你几乎肯定有一个对象分配到sd。注意我是如何通过下面的sd变量分配一个值重新创建错误:

by(warpbreaks[, 1], warpbreaks$wool, sd) 
warpbreaks$wool: A 
# [1] 15.85143 
# ------------------------------------------------------ 
# warpbreaks$wool: B 
# [1] 9.300921 
sd <- 5 
by(warpbreaks[, 1], warpbreaks$wool, sd) 
# Error in FUN(X[[1L]], ...) : could not find function "FUN" 
rm(sd) 
by(warpbreaks[, 1], warpbreaks$wool, sd) 
# warpbreaks$wool: A 
# [1] 15.85143 
# ------------------------------------------------------ 
# warpbreaks$wool: B 
# [1] 9.300921 

您需要rm(sd)

+0

你是对的,我只是有另一个对象称为SD。这也是一个问题。谢谢。 – alexmulo

+0

@alexmulo,如果确实已经回答,您应该将您的问题标记为已回答。谢谢。 – BrodieG