【问题标题】:R - Sum columns after spread without knowing column names [duplicate]R - 在不知道列名的情况下对列进行求和 [重复]
【发布时间】:2018-08-20 22:32:10
【问题描述】:

我有一个数据集,我想在展开后对所有列的值求和。

例如,如果我有data.frame:

data.frame(
     country = c('US','US','Brazil','Brazil','Canada'), 
     variable = c('v1','v2','v1','v3','v4'),
     value = c(1,2,3,4,5)
   ) %>%
   spread(variable, value, fill = 0)

结果:

  country v1 v2 v3 v4
1  Brazil  3  0  4  0
2  Canada  0  0  0  5
3      US  1  2  0  0

我希望它像这样结束:

  country v1 v2 v3 v4  total
1  Brazil  3  0  4  0  7
2  Canada  0  0  0  5  5
3      US  1  2  0  0  3

通常一个简单的mutate(total = v1 + v2 + v3 + v4) 可以解决问题,但就我而言,我事先不知道列名。

如何创建这个新列?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我只会使用rowSums,删除第一列。但我同意@MrFlick 的观点,在传播之前这样做可能更容易。

    data.frame(
         country = c('US','US','Brazil','Brazil','Canada'), 
         variable = c('v1','v2','v1','v3','v4'),
         value = c(1,2,3,4,5)
       ) %>%
       spread(variable, value, fill = 0) %>% 
       mutate(total = rowSums(.[ ,-1]))
    
      country v1 v2 v3 v4 total
    1  Brazil  3  0  4  0     7
    2  Canada  0  0  0  5     5
    3      US  1  2  0  0     3
    

    【讨论】:

      【解决方案2】:

      很多方法,你可能想多了:p。如果拆分它更自然(它是 IMO),它不必全部在一条线上。

      df <- data.frame(
        country = c('US','US','Brazil','Brazil','Canada'), 
        variable = c('v1','v2','v1','v3','v4'),
        value = c(1,2,3,4,5)
      )
      results1 <- df %>% group_by(country) %>% summarize(total = sum(value))
      results2 <- df %>% spread(variable, value, fill = 0)
      results <- results2 %>% full_join(results1, by="country")
      

      【讨论】:

        【解决方案3】:

        似乎在您的数据首先是长格式时计算值会更容易

        dd <- data.frame(
          country = c('US','US','Brazil','Brazil','Canada'), 
          variable = c('v1','v2','v1','v3','v4'),
          value = c(1,2,3,4,5)
        )
        
        dd %>% group_by(country) %>% 
          summarize(variable="total", value=sum(value)) %>% 
          rbind(dd) %>% 
          spread(variable, value, fill = 0)
        #   country total    v1    v2    v3    v4
        # *  <fctr> <dbl> <dbl> <dbl> <dbl> <dbl>
        # 1  Brazil     7     3     0     4     0
        # 2  Canada     5     0     0     0     5
        # 3      US     3     1     2     0     0
        

        【讨论】:

          猜你喜欢
          • 2022-07-21
          • 2013-07-26
          • 1970-01-01
          • 2014-12-07
          • 2021-09-26
          • 2017-12-23
          • 2011-01-11
          • 2018-01-11
          • 2018-11-16
          相关资源
          最近更新 更多