根据组创建具有摘要值的新变量

时间:2019-06-14 21:53:18

标签: r ggplot2 dplyr mutate summarize

我真的有两个问题。我很确定第二个可以帮助我解决第一个,但是我可能完全走错了路,并且可能会有更简单的解决方案。

第一个问题:我想使用ggplot2和geom_bar制作堆积的条形图。我有许多国家的时间序列数据,每4个离散时间间隔(年)。我知道将时间序列数据显示为条形图是非常规的(我愿意接受其他建议)。我想要做的是将条形图显示为分面网格(按年份),其中基于我在所有4年中所有4个变量的总和,以相同的降序显示国家。我只想显示前25个国家/地区。

为此,我一直使用dplyr管道和ggplot的组合。

首先,我用

计算了一个新列
 data %>% 
  rowwise() %>% 
  mutate(total = sum(var1, var2, var3, var4, na.rm = T) %>% 
  arrange(desc(total)) %>% 
  top_n(100, total) %>% 
  ggplot...

但这只会显示我每个国家/年对的总数,并且有一些副作用,例如使某些国家/地区空白,因为这些年份的值未进入前100名。

接下来我要尝试的是使用summary函数将所有4年的4个变量相加:

 data %>% 
  summarize(sum = sum(var1, var2, var3, var4, na.rm = T))

但是这将我的表缩小为两列,我知道这是期望的输出,但是我不知道如何获得所有年份中分配给各个国家的新总和。

我将在此处尝试重现这两个问题:

一些数据:

 countries <- c("country A", "country B", "country C", "country D", "country E")
  years <- rep(c(2014, 2015, 2016, 2017), 5)
  set.seed(123)
  var1 <- sample(1:1000, 20)
  var2 <- sample(1:1000, 20)
  var3 <- sample(1:1000, 20)
  var4 <- sample(1:1000, 20)
  data <- data.frame(countries, years, var1, var2, var3, var4)

  data %>% 
   rowwise() %>% 
   mutate(total = sum(var1, var2, var3, var4, na.rm = T)) %>% 
   gather(key, value, 3:6) %>% 
   top_n(32, total) %>% 
    ggplot(., aes(x = countries, y = value, fill = key)) + 
     geom_col() + 
     facet_grid(cols = vars(years)) + 
     coord_flip()

Undesired Output

如您所见,正如代码所期望的那样,R计算每个国家/年对的总和,而不是计算所有年份中每个国家的总和。我严重迷失了如何进行。任何帮助表示赞赏!

如果有什么区别:Var3和Var4中有许多NA。

我忘了说明第二个问题:

  data %>% 
   group_by(countries) %>% 
   summarize(sum = sum(var1, var2, var3, var4, na.rm = T))

返回包含国家和总和的表格,但是如何将新列重新分配给我的原始数据框?

1 个答案:

答案 0 :(得分:0)

在r2evans之后,这为我解决了问题:

我首先总结所有值并将其保存到新的数据集中

data2 <- data %>% 
 group_by(countries) %>% 
 summarize(sum = sum(var1, var2, var3, var4, na.rm = T))

然后我left_join这样设置两个数据集

 left_join(data, data2)

我可以指定by = countries,但不必这样做,因为它是两个数据集中唯一的公共变量。

虽然这解决了问题,并且我永远感谢r2evans,但我仍然想知道一步解决方案。请发表评论。