R - 在不知道列名的情况下传播后的列

时间:2018-03-12 19:30:34

标签: r dplyr

我有一个数据集,我想在传播之后对所有列值求和。

例如,如果我有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)可以解决问题,但就我而言,我对列名没有先验知识。

如何创建这个新列?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

很多方面,你可能会过度思考这个: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")