将标准偏差应用于按因子分割的数据框

时间:2014-01-27 13:27:35

标签: r dataframe

我正在尝试将sd函数应用于我的数据框,但它不起作用:

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

你知道为什么吗?

非常感谢。

4 个答案:

答案 0 :(得分: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 :(得分:1)

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

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

答案 2 :(得分: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)

答案 3 :(得分:0)

sd(nowna[,1:16])可能无效。这将有效:

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