【问题标题】:Collapsing a data frame over one variable在一个变量上折叠数据框
【发布时间】:2014-10-22 16:34:53
【问题描述】:

我有一个格式如下的数据框:

Site    Year    Month   Count1  Count2  Count3  Patch
1        1        May     15      12      10      1
1        1        May     8        0      5       2
1        1        May     3         1      2      3
1        1        May     4        4      1       4
1        1        June    6       5       1       1
1        1        June    9        1      3       2
1        1        June    3       0       0       3
1        1        June    5       5       2       4
1        1        July    4       0       3       1
..........

并且我希望在补丁级别上折叠数据框,以便将三个计数变量相加。即

Site    Year    Month   Count1  Count2  Count3  
1        1        May     30      17      18     
1        1        June    23      11       6       
1        1        July     4       0       3      
.........

我查看了 aggregate 和 tapply 命令,但它们似乎没有按要求对补丁求和。

有人可以就可以相应转换数据的命令提出建议吗?

谢谢。

【问题讨论】:

  • ???你期望“补丁”扮演什么角色? aggregate 会给你这个输出没有问题....
  • 您显然想要总结的不仅仅是补丁,而是补丁、年份、站点和月份。您对聚合的失败可能源于无法正确描述完整的规范。
  • 感谢您的所有帮助。这三种方法都可以完美运行。

标签: r dataframe collapse


【解决方案1】:

data.table 解决方案(这将使您的数据按原始月份顺序排序)

library(data.table)
setDT(df)[, lapply(.SD, sum), 
            by = list(Site, Year, Month), 
            .SDcols = paste0("Count", seq_len(3))]

#    Site Year Month Count1 Count2 Count3
# 1:    1    1   May     30     17     18
# 2:    1    1  June     23     11      6
# 3:    1    1  July      4      0      3

【讨论】:

  • 它以原始顺序返回是一个非常好的功能。
  • @RichardScriven,你可以做任何一种方式。如果要对其进行排序,请使用 keyby 而不是 by
  • 或者:setDT(df)[, lapply(.SD,sum), by=list(Site,Year,Month), .SDcols=-"Patch"]
【解决方案2】:
library(dplyr) 
dat %>% 
group_by(Site, Year, Month) %>% 
summarise_each(funs(sum=sum(., na.rm=TRUE)), Count1:Count3)
# Source: local data frame [3 x 6]
#Groups: Site, Year

#    Site Year Month Count1 Count2 Count3
#  1    1    1  July      4      0      3  
#  2    1    1  June     23     11      6
#  3    1    1   May     30     17     18

【讨论】:

    【解决方案3】:

    有聚合:

    > ( a <- aggregate(.~Site+Year+Month, dat[-length(dat)], sum) )
    #   Site Year Month Count1 Count2 Count3
    # 1    1    1  July      4      0      3
    # 2    1    1  June     23     11      6
    # 3    1    1   May     30     17     18
    

    dat 是您的数据。

    请注意,您在帖子中的 7 月份结果似乎不正确。

    对于原始数据顺序的结果,可以使用

    > a[order(as.character(unique(dat$Month))), ]
    #   Site Year Month Count1 Count2 Count3
    # 3    1    1   May     30     17     18
    # 2    1    1  June     23     11      6
    # 1    1    1  July      4      0      3
    

    【讨论】:

    • 另一种保持订单的方式aggregate(dat[-3], by = with(dat, list(Site, Year, factor(Month, levels = unique(Month)))), sum)
    猜你喜欢
    • 2021-07-12
    • 1970-01-01
    • 1970-01-01
    • 2017-11-10
    • 2011-09-24
    • 2013-12-13
    • 1970-01-01
    • 2011-02-03
    • 2016-12-22
    相关资源
    最近更新 更多