在R中按组生成摘要表

3
考虑以下数据框:
 df <- data.frame(group = c("group1", "group1", "group2", "group2", "group2", "group3"), factor = paste("factor", 1:6, sep=""), vol = seq(from = 0.02, length.out = 6, by = 0.02))

第一列定义了第二列中每个因子的顶级分组。第三列是每个因子的标准差值。
我想生成一个仅包含分组和每个组标准差的摘要表,其中每个组的标准差定义为:
如果group1包含f1和f2两个因子,并且vol(f1)和vol(f2)分别是f1和f2的标准偏差,则group1的标准偏差为: std(group1)=sqrt[vol(f1)^2 + vol(f2)^2]
是否有任何简单的方法创建摘要表,其中每个组的vol使用此自定义函数计算?
任何帮助将不胜感激!谢谢。
4个回答

5
为了保险起见,提供一种基本解决方案。
by(df,df$group,function(x) sqrt(sum(x$vol^2)))

如果你想让它看起来更漂亮:
as.table(df,df$group,function(x) sqrt(sum(x$vol^2))))

df$group
    group1     group2     group3 
0.04472136 0.14142136 0.12000000 

4

我可以提出一个使用ddply函数的解决方案:

# require(plyr)
ddply(df, .(group), summarize, std = sqrt(sum(vol^2)))

#    group        std
# 1 group1 0.04472136
# 2 group2 0.14142136
# 3 group3 0.12000000

@Mariam,谢谢您接受我的答案。为了给您更多的视角,我意识到plyr与由@andyteucher提出的dplyr包有关。后者在较大的数据框中可能表现更好(参考)。 - TWL

3

通过使用新型的神奇dplyr包,我认为这就是你所需要的:

require(dplyr)

df <- data.frame(group = c("group1", "group1", "group2", "group2", "group2", "group3"), 
                 factor = paste("factor", 1:6, sep=""), 
                 vol = seq(from = 0.02, length.out = 6, by = 0.02))

df %.% group_by(group) %.% summarise(grp_std=sqrt(sum(vol^2)))

# Source: local data frame [3 x 2]

#    group    std_dev
# 1 group1 0.04472136
# 2 group2 0.14142136
# 3 group3 0.12000000

使用%.%链式语法需要一些适应时间,但它变得非常直观。替代语法:

df_grouped <- group_by(df, group)

summarise(df_grouped, grp_std=sqrt(sum(vol^2)))

1

我可以推荐使用基础包stats中的aggregate(),但你需要先定义一个新函数。

ss<-function(x){sqrt(sum(x^2))}
aggregate(vol~group,data=df,FUN=ss)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接