【问题标题】:R Conditional Summarizing [duplicate]R条件总结[重复]
【发布时间】:2017-07-16 10:33:10
【问题描述】:

我有一个公司栏,一个销售栏,另一个国家栏。我需要分别汇总每个国家/地区的所有销售额,以便每个公司(名称)都有一个栏作为总数在国内的销售。所有国家/地区的销售额均以相同的货币表示。

我尝试了几种方法,但都不起作用:

df$total_country_sales = if(df$country[row] == df$country) { sum(df$sales)} 
This sums all valuations, not only the ones that I need.


Name  Sales  Country   I would like to have a new column Total Country Sales 
abc   122    US                                                5022
abc   100    Canada
aad   4900   US

我需要将值放在同一个数据框中,但在一个新列中。

由于它是一个大数据集,我无法制作一个函数来这样做,而是需要将其直接保存为变量。 (还是我理解错了,制作函数并不是解决此类问题的最佳方法?)

我是 R 和一般编程的新手,所以我可能以不正确的方式解决这个问题。

抱歉,这可能是一个愚蠢的问题。

谢谢!

【问题讨论】:

  • 请参阅此处stackoverflow.com/questions/5963269/…,获取有关如何制作可重现示例的指南。如果您可以分享您的一些代码和数据(使用 dput),这将对回答您的问题有很大帮助。

标签: r plyr sumifs dplyr


【解决方案1】:

如果我正确理解您的问题,这可以解决您的问题:

df = data.frame(sales=c(1,3,2,4,5),region=c("A","A","B","B","B"))

library(dplyr)
totals = df %>% group_by(region) %>% summarize(total = sum(sales))
df = left_join(df,totals)

它将组总计添加为单独的列,如下所示:

  sales region total
1     1      A     4
2     3      A     4
3     2      B    11
4     4      B    11
5     5      B    11

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    我们可以使用base R 来做到这一点

    df$total_country_sales <- with(df, ave(sales, country, FUN = sum))
    

    【讨论】:

      【解决方案3】:

      可以使用dplyrmutate()来实现

      df = data.frame(sales=c(1,3,2,4,5),country=c("A","A","B","B","B"))
      df
      #   sales country
      # 1     1       A
      # 2     3       A
      # 3     2       B
      # 4     4       B
      # 5     5       B
      
      df %>% group_by(country) %>% mutate(total_sales = sum(sales))
      # Source: local data frame [5 x 3]
      # Groups: country [2]
      # 
      # # A tibble: 5 x 3
      #   sales country total_sales
      #   <dbl>  <fctr>       <dbl>
      # 1     1       A           4
      # 2     3       A           4
      # 3     2       B          11
      # 4     4       B          11
      # 5     5       B          11
      

      使用data.table

      library(data.table)
      setDT(df)[, total_sales := sum(sales), by = country]
      df
      #    sales country total_sales  
      # 1:     1       A           4
      # 2:     3       A           4
      # 3:     2       B          11
      # 4:     4       B          11
      # 5:     5       B          11
      

      【讨论】:

        猜你喜欢
        • 2020-12-16
        • 1970-01-01
        • 2021-03-03
        • 1970-01-01
        • 2017-09-14
        • 2021-06-30
        • 1970-01-01
        • 2019-06-18
        • 1970-01-01
        相关资源
        最近更新 更多