R ggplot 比较相似(但不相同)的分类数据列

问题描述 投票:0回答:1

我有一个看起来像这样的数据集:

平台 twitter_context facebook_context insta_context
推特 标签 NA NA
脸书 NA 脸书群组 NA
Instagram NA NA 公众人物
Instagram NA NA 标签
脸书 NA 一个朋友 NA
推特 我关注的人 NA NA

… 总行数 > 1600

我想要实现的是一个条形图,它通过“平台”比较那些“_context”列中类别的频率。

之前用过ggplot画过结合两个变量的条形图。 但是在这里,那些“_contexts”中的类别是相似的,但不完全相同。

由于每个上下文列仅适用于一个平台,我尝试使用 mutate 函数将三个上下文列合并到一个新列中。然而,我没能让它正常工作:当我连续运行三个 mutate 行时,NA 总是会覆盖以前的类别。 我试图用 if/else_if-conditions 来解决这个问题,只将适当的数据粘贴到新列(并忽略那些 NA)。但是这个想法因为我缺乏语法理解而注定失败。

我想一定有办法做到这一点,但是,我做不到。 (我有没有提到我对此很陌生?)

我的意图是,我可以使用新的“all_contexts”列绘制图表,并按平台在 x 轴上将其拆分。 (标签仍然是一团糟,但可能可以通过应用级别来解决。)

我可以想象的一种不同的方法是让 ggplot 绘制三个独立的条形图,然后必须手动标准化,除非有办法在一个图中以某种方式“连接”。

很可能这个菜鸟问题已经在我找不到的线程中解决了。 有人能指出我正确的方向吗?感谢您的帮助!

ggplot2 bar-chart categorical-data
1个回答
0
投票

有多种方法可以转换您的数据,为您要创建的绘图做好准备。此处说明了一种方法,我们使用

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")
© www.soinside.com 2019 - 2024. All rights reserved.