【问题标题】:Summarize data by a subset of grouping variable按分组变量的子集汇总数据
【发布时间】:2014-11-08 15:53:12
【问题描述】:

我也想用 ddply 或聚合来逐列汇总,我知道该怎么做...但是,我还想在分组变量中添加组以自定义方式汇总数据,请参阅下面:

##Create Data
year<-c(2008,2008,2008,2008,2009,2009,2009,2010,2010,2010,2010,2011,2011,2011,2011,2011)
catch<-c(1,2,0,1,1,0,1,0,1,2,1,0,1,1,1,0)
df<-data.frame(year,catch)

##I know how to aggregate by year:
yearlyAVcap<-ddply(df,~year,summarise,mean=mean(catch),sd=sd(catch))

##But I'd like to have 2008,2009,2010 summarized together and 2011 on it's own (i,e two groups-    1=2008,2009,2010 ; 2=2011)

【问题讨论】:

    标签: r aggregate plyr group-summaries


    【解决方案1】:

    你可以试试

    df1 <- transform(df, yrGroup=c('2008-2010', '2011')[(year==2011)+1])
    
    
    library(plyr)
    ddply(df1, .(yrGroup), summarise, mean=mean(catch), sd=sd(catch))
    #  yrGroup        mean        sd
    #1 2008-2010 0.9090909 0.7006490
    #2      2011 0.6000000 0.5477226
    

    或使用dplyr

     df1 %>%
          group_by(yrGroup) %>%
          summarise_each(funs(mean, sd), catch)
     #summarise_each can be used for multiple columns 
    #    yrGroup      mean        sd
    #1 2008-2010 0.9090909 0.7006490
    #2      2011 0.6000000 0.5477226
    

    说明

    为了得到两个不同年份的组,在示例中(2008-20102011),我们可以使用== 来匹配第二组年份,即2011。结果将是一个逻辑向量。然后,我们可以通过向其添加1 将其转换为数字索引,以便两组将12。如果我们添加0,则TRUE 将转换为1,FALSE 为0。此数字索引可用于将其重命名为 2008-20102011

    df$year==2011
     #[1] FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE FALSE  TRUE
    #[13]  TRUE  TRUE  TRUE  TRUE
    
    (df$year==2011)+1
     #[1] 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2
    
     c('2008-2010', '2011')[(df$year==2011)+1]
     #[1] "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2008-2010"
     #[7] "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2008-2010" "2011"     
     #[13] "2011"      "2011"      "2011"      "2011"     
    

    假设我们有多个年份,例如2008-2010 为一组,2011-2013 为另一组,我们可以使用%in%

      (df$year %in% 2011:2013)+1
    

    【讨论】:

    • 谢谢!,我明白 yrGroup=c('2008-2010', '2011') 部分是做什么的,但是这个 [(year==2011)+1]) 是做什么的?
    • @ctlamb year==2001 返回一个逻辑向量。如果添加1 进行添加,则会得到1 and 2 的数字索引
    • 如果我有更多的年份,例如 2012 年和 2013 年,我想被添加,我会做 [((year==2011)+1)((year==2012)+ 1)] 等等?
    • @ctlamb 这取决于您想要的组。在这里,在问题中,您要求 2011 成为一个组。如果你需要2012作为一个单独的组,是的,你可以用year==2012替换它
    猜你喜欢
    • 1970-01-01
    • 2023-01-12
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 2013-08-26
    • 2018-11-27
    • 2020-08-03
    • 1970-01-01
    相关资源
    最近更新 更多