【问题标题】:Partial sum of dataframe [duplicate]数据帧的部分总和[重复]
【发布时间】:2020-01-06 09:26:26
【问题描述】:

如果我有

year       veg  number
2017 aubergine       3
2017    tomato      13
2017  eggplant       4
2018 aubergine       1
2018    tomato      17
2018  eggplant       3

如何将 aubergineeggplant 每年的数据相加得到

year       veg  number
2017 aubergine       7
2017    tomato      13
2018 aubergine       4
2018    tomato      17

?

【问题讨论】:

    标签: r dataframe sum


    【解决方案1】:

    您可以用aubergine 覆盖eggplant,然后用vegyear 覆盖aggregate number

    x  <- read.table(header=TRUE, text="year       veg  number
    2017 aubergine       3
    2017    tomato      13
    2017  eggplant       4
    2018 aubergine       1
    2018    tomato      17
    2018  eggplant       3")
    
    x$vegb  <- x$veg
    x$vegb[x$vegb == "eggplant"]  <- "aubergine"
    
    aggregate(number ~ vegb + year, data=x, FUN=sum)
    #       vegb year number
    #1 aubergine 2017      7
    #2    tomato 2017     13
    #3 aubergine 2018      4
    #4    tomato 2018     17
    

    【讨论】:

    • 创建一个新列是个好主意,我会尽量记住这一点,尽管在下面的第二个示例中使用transform stackoverflow.com/a/57772285/1409644 在我看来更优雅一点案例。
    【解决方案2】:

    一种方法是replace"eggplant""aubergine",然后是group_byyearveg,然后是sum

    library(dplyr)
    df %>%
      mutate(veg = replace(veg, veg == "eggplant", "aubergine")) %>%
      group_by(year, veg) %>%
      summarise(number = sum(number))
    
    #   year veg       number
    #  <int> <fct>      <int>
    #1  2017 aubergine      7
    #2  2017 tomato        13
    #3  2018 aubergine      4
    #4  2018 tomato        17
    

    在基础 R 中,这可以通过 transformaggregate 完成

    aggregate(number~year + veg, 
        transform(df, veg = replace(veg, veg == "eggplant", "aubergine")), sum)
    

    【讨论】:

    • 就我而言,transformaggregate 的方法似乎最适合我的卑微需求。 dplyr 的解决方案很有趣,尽管我认为 mutate 的文档很不幸,这里的 dplyr.tidyverse.org/reference/mutate.html 只使用了tibble 之类的概念而没有提供链接。
    猜你喜欢
    • 1970-01-01
    • 2018-03-03
    • 1970-01-01
    • 2018-10-23
    • 2020-09-04
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多