我有一个看起来像这样的数据集:
平台 | twitter_context | facebook_context | insta_context |
---|---|---|---|
推特 | 标签 | NA | NA |
脸书 | NA | 脸书群组 | NA |
NA | NA | 公众人物 | |
NA | NA | 标签 | |
脸书 | NA | 一个朋友 | NA |
推特 | 我关注的人 | NA | NA |
… 总行数 > 1600
我想要实现的是一个条形图,它通过“平台”比较那些“_context”列中类别的频率。
之前用过ggplot画过结合两个变量的条形图。 但是在这里,那些“_contexts”中的类别是相似的,但不完全相同。
由于每个上下文列仅适用于一个平台,我尝试使用 mutate 函数将三个上下文列合并到一个新列中。然而,我没能让它正常工作:当我连续运行三个 mutate 行时,NA 总是会覆盖以前的类别。 我试图用 if/else_if-conditions 来解决这个问题,只将适当的数据粘贴到新列(并忽略那些 NA)。但是这个想法因为我缺乏语法理解而注定失败。
我想一定有办法做到这一点,但是,我做不到。 (我有没有提到我对此很陌生?)
我的意图是,我可以使用新的“all_contexts”列绘制图表,并按平台在 x 轴上将其拆分。 (标签仍然是一团糟,但可能可以通过应用级别来解决。)
我可以想象的一种不同的方法是让 ggplot 绘制三个独立的条形图,然后必须手动标准化,除非有办法在一个图中以某种方式“连接”。
很可能这个菜鸟问题已经在我找不到的线程中解决了。 有人能指出我正确的方向吗?感谢您的帮助!
有多种方法可以转换您的数据,为您要创建的绘图做好准备。此处说明了一种方法,我们使用
pivot_longer()
并删除 NA 的行,然后通过 platform
和 context
计算行数
library(dplyr)
library(tidyr)
ggdata <- df %>%
pivot_longer(cols = ends_with('context'), names_to = "p", values_to = "context") %>%
filter(!is.na(context)) %>%
count(platform,context)
现在,您可以使用
ggplot()
直接将框架按原样传递给 geom_col()
,或者您可以为未表示的平台/上下文组合添加行。
这里是前一种方法的例子:
library(ggplot2)
ggplot(ggdata, aes(platform, n, fill=context)) + geom_col(position = "dodge")