【问题标题】:Cannot access data from tbl df object to be used on ggplot2无法访问要在 ggplot2 上使用的 tbl df 对象的数据
【发布时间】:2018-03-28 09:18:03
【问题描述】:

我正在研究一组 LDA 模型,以比较它们对主题分配的预测准确性。下面是一些简短的描述。

我应用每个文档的每个主题分配,为每个文档提取具有最高“gamma”(总共 15 个)的主题,然后我使用 Chang 和 Blei 的 (2009) rtm 方法来获得每个文档每个单词的主题预测/token 并选择给定文档中最常见的主题作为该文档的预测主题。最后,我将两个预测与topic 合并在一起作为第一种方法的标题consensus 作为第二种方法,与文档ID 匹配并保留原始文档文本。数据(命名为assignments)可以评估为here(330 x 6,不是很大)。

我尝试使用ggplot2 可视化方法的预测准确性,使用每个文档/每个主题方法作为沿 y 轴绘制的基线,并在 x 轴上评估 rtm 方法,如下所示代码

library(foreign)
library(topicmodels)
library(tm)
library(tidyr)
library(plyr)
library(ggplot2)
library(lda)
library(igraph)
library(scales)

load("~/assignments.Rdata")

assignments %>%
  count(topic, consensus, wt_var = freq) %>%
  group_by(topic) %>%
  mutate(percent = n / sum(n)) %>%
  ggplot(aes(consensus, topic, fill = percent)) +
  geom_tile() +
  scale_fill_gradient2(high = "red", label = percent_format()) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 90, hjust = 1),
        panel.grid = element_blank()) +
  labs(x = "RTM assignments",
       y = "Documents came from",
       fill = "% of assignments")

但是,我在count(topic, consensus,...) 行收到一条错误消息,显示Error in count(., topic, consensus, wt_var = freq) : unused argument (consensus),但是,如果我从代码行中删除consensus,我得到Error in count(., topic, wt_var = freq) : object 'topic' not found 。 我怀疑这可能是 S4 类问题(也可能不是),所以我尝试了以下方法。在group_by() 变量上使用"",但它不起作用。相反,我收到了这条错误消息Error in sum(n) : invalid 'type' (closure) of argument

然后我使用tbl_df(assignments)assignments 转换为与tibble 兼容的对象。再次,它不起作用,R 仍然无法从 tibble 对象中找到 consensustopic 数据。

我真的很困惑,希望有人看看我的代码并就此给予我启发。

谢谢。

【问题讨论】:

  • plyr 有一个计数函数,它会与 dplyr 的计数函数发生冲突。如果您需要同时加载两者(不太可能),则需要以正确的顺序加载它们
  • 我需要 plyr 用于 percent_format() 代码块中的 ggplot。那么我应该在dplyr 之前先加载plyr 吗?
  • 如果它只用于一个功能我会使用plyr::percent_format()
  • 糟糕,percent_format() 位于 scales 包中,而不是 plyr。对此感到抱歉。

标签: r ggplot2 lda topic-modeling tbl


【解决方案1】:

我认为您在函数的前半部分遇到了数据操作问题。我首先按主题和共识对分配进行分组,以便计数可以区分它们(而不是仅仅返回频率总和),然后应用计数(使用引号中的变量),最后改变:

library(dplyr)

assignments_2 <- assignments %>% group_by(topic, consensus) %>%
    count(vars = "topic", wt_var = "freq") %>%
    mutate(percent = n / sum(n))

如果这将数据转换成我认为你想要的格式,那么你应该能够绘制你的图表!

【讨论】:

  • 感谢您的建议,但重新运行ggplot 代码:Error in sum(n) : invalid 'type' (closure) of argument 后仍然返回相同的错误消息。错误出现在count()mutate() 行之间,那里肯定有一些我没有弄清楚的排序问题。
  • 抱歉,我把管道放错了地方(对 R 来说还是很新的)。数据操纵。对我来说很好,虽然我刚刚注意到 count() 删除了你想在 ggplot 中使用的文档变量 - 我不知道如何在不知道你到底想要什么的情况下解决这个问题小标题。
  • 嗨,我的还是不行。奇怪的是,如果我在count 变量上使用引号""count()mutate() 将生成我想要的数据格式,但它不适合ggplot,因为它会返回错误消息invalid 'type' (closure) of argument。这表明一些对象已经在我不知道的情况下转化为“功能”,我猜。
  • 我找到了这个post,但没有一个方法是有效的,至少对于我的数据来说,似乎dplyr 以某种方式更改了一些代码。
  • 尝试将你的代码分成不同的函数而不是管道所有的东西,这至少可以解决你的关闭错误。至于 ggplot,我得到了这些错误:Don't know how to automatically pick scale for object of type function. Defaulting to continuous. Error: Column y` must be a 1d atomic vector or a list` - 我不太明白你要绘制什么,所以我不确定我能不能帮忙?
猜你喜欢
  • 1970-01-01
  • 2021-04-18
  • 2019-12-01
  • 1970-01-01
  • 2015-07-09
  • 1970-01-01
  • 2020-04-27
  • 2017-11-03
相关资源
最近更新 更多