考虑以下数据框:
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
是使用此自定义函数计算的?
任何帮助将不胜感激!谢谢。
答案 0 :(得分: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
答案 1 :(得分:4)
良好衡量的基础解决方案。
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
答案 2 :(得分: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)))
答案 3 :(得分:0)
我可以从基本软件包aggregate()
推荐stats
,但您必须先定义一个新函数。
ss<-function(x){sqrt(sum(x^2))}
aggregate(vol~group,data=df,FUN=ss)