2015-10-15 46 views
4

我编写了一个函数(weighted.sd),它给出了一些加权统计信息(如均值,标准差,标准误差和95%置信区间)。我想对因子变量(区域)的每个级别应用此函数,然后使用ggplot2图中带误差条的每个区域的加权统计量(因此为95%置信区间)。如何在dplyr中使用group_by()和do()为每个因子级别应用函数

我也尝试了tapply和a 。-loop但我仍然不会正确此外,我喜欢用dplyr像我可以,因为它很容易阅读和理解

这是我最好的尝试:。

#example data 
data<-as.data.frame(cbind(rnorm(1:50),as.factor(rnorm(1:50)),rnorm(1:50))) 
colnames(data)<-c("index_var","factor_var","weight_var") 

weighted.sd <- function(x,weight){ 
    na <- is.na(x) | is.na(weight) 
    x <- x[!na] 
    weight <- weight[!na] 
    sum.w <- sum(weight) 
    sum.w2 <- sum(weight^2) 
    mean.w <- sum(x * weight)/sum(weight) 
    x.var.w<- (sum.w/(sum.w^2 - sum.w2)) * sum(weight * (x - mean.w)^2) 
    x.sd.w<-sqrt((sum.w/(sum.w^2 - sum.w2)) * sum(weight * (x - mean.w)^2)) 
    SE<- x.sd.w/sqrt(sum(weight)) 
    error <- qnorm(0.975)*x.sd.w/sqrt(sum(weight)) 
    left <- mean.w-error 
    right <- mean.w+error 
    return(cbind(mean.w,x.sd.w,SE,error,left,right)) 
} 

test<- data %>% 
    group_by(factor_var) %>% 
    do(as.data.frame(weighted.sd(x=index_var,weight=weight_var))) 
test 

这会导致一条错误消息(对不起,其中一部分是德语,但您可以使用该代码进行复制):

Error in as.data.frame(weighted.sd(x = index_var, weight = weight_var)) : 
     Fehler bei der Auswertung des Argumentes 'x' bei der Methodenauswahl 
    für Funktion 'as.data.frame': Error in weighted.sd(x = index_var, weight = weight_var) : 
     object 'index_var' not found 

回答

5

dplyr使用do你需要为了与.$使用像这样的工作:

test<- data %>% 
    group_by(factor_var) %>% 
    do(as.data.frame(weighted.sd(x=.$index_var,weight=.$weight_var))) 
test 

所以,这将工作:

> test 
Source: local data frame [50 x 7] 
Groups: factor_var [50] 

    factor_var  mean.w x.sd.w SE error left right 
     (dbl)  (dbl) (dbl) (dbl) (dbl) (dbl) (dbl) 
1   1 1.79711934 NaN NaN NaN NaN NaN 
2   2 -0.70698012 NaN NaN NaN NaN NaN 
3   3 -0.85125760 NaN NaN NaN NaN NaN 
4   4 -0.93903314 NaN NaN NaN NaN NaN 
5   5 0.09629631 NaN NaN NaN NaN NaN 
6   6 1.02720022 NaN NaN NaN NaN NaN 
7   7 1.35090758 NaN NaN NaN NaN NaN 
8   8 0.67814249 NaN NaN NaN NaN NaN 
9   9 -0.28251464 NaN NaN NaN NaN NaN 
10   10 0.38572499 NaN NaN NaN NaN NaN 
..  ...   ... ... ... ... ... ... 

但是,你的数据在这里由于负权重(data$weight_var)产生上述NAN,因此不太好。特别是sqrt(negative number)部分。

+0

非常感谢!我不知道这一点,它与我的真实数据一起工作(没有负面的权重)。 – SEMson

+0

不客气,很高兴我能帮忙:) – LyzandeR

相关问题