我有一个数据集,我想在传播之后对所有列值求和。
例如,如果我有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)
可以解决问题,但就我而言,我对列名没有先验知识。
如何创建这个新列?
答案 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")