我真的有两个问题。我很确定第二个可以帮助我解决第一个,但是我可能完全走错了路,并且可能会有更简单的解决方案。
第一个问题:我想使用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()
如您所见,正如代码所期望的那样,R计算每个国家/年对的总和,而不是计算所有年份中每个国家的总和。我严重迷失了如何进行。任何帮助表示赞赏!
如果有什么区别:Var3和Var4中有许多NA。
我忘了说明第二个问题:
data %>%
group_by(countries) %>%
summarize(sum = sum(var1, var2, var3, var4, na.rm = T))
返回包含国家和总和的表格,但是如何将新列重新分配给我的原始数据框?
答案 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,但我仍然想知道一步解决方案。请发表评论。