【问题标题】:How do you plot a histogram of the terms that occur n or more times?如何绘制出现 n 次或更多次的项的直方图?
【发布时间】:2014-11-27 19:14:41
【问题描述】:

我有一个直接来自文件的单词列表,每行一个,我使用 read.csv 导入,生成一个 data.frame。我需要做的是计算和绘制每个单词的出现次数。那,我可以轻松做到,但问题是我有几百个单词,其中大部分在列表中只出现一两次,所以我对它们不感兴趣。

编辑 https://gist.github.com/anonymous/404a321840936bf15dd2#file-wordlist-csv 这是一个示例单词表,您可以使用它来尝试。它与我使用的不同,我不能分享它,因为它是来自实际实验的实际数据,我不允许分享它。出于所有意图和目的,此列表具有可比性。

一个“简单”

df <- data.frame(table(words$word))
df[df$Freq > 2, ]

成功了,我现在有一个出现两次以上的单词列表,以及为什么我必须从一个 data.frame 转到一个数组并返回一个 data.frame 只是一个令人头疼的问题要做到这一点,更不用说我必须在实际选择字符串中重复 data.frame 的名称。完全打败我。

问题是现在过滤后的 data.frame 对图表毫无用处。假设这是我过滤后得到的

        Var1 Freq
6     aspect    3
24    colour    7
41    differ   18
55    featur    7
58  function   19
81      look    4
82      make    3
85      mean    7
95   opposit   14
108 properti    3
109   purpos    6
112    relat    3
116   rhythm    4
118    shape    6
120  similar    5
123    sound    3

显然,如果我只是做一个

plot(df[df$Freq > 2, ])

我明白了

显然(显然?)在 x 轴上具有所有原始项,而 y 轴仅显示过滤后的值。所以下一个合乎逻辑的步骤是尝试强迫 R 的手

plot(x=df[df$Freq > 2, ]$Var1, y=df[df$Freq > 2, ]$Freq)

但显然 R 最了解并且已经这样做了,因为我得到了完全相同的结果。使用 ggplot2 会好一些

qplot(x=df[df$Freq > 2, ]$Var1, y=df[df$Freq > 2, ]$Freq)

(为了保持一致性)但我希望它显示一个实际的直方图,你知道,有条形图,就像他们在六年级教的那样,所以如果我问这个

qplot(x=df[df$Freq > 2, ]$Var1, y=df[df$Freq > 2, ]$Freq) + geom_bar()

我明白了

Error : Mapping a variable to y and also using stat="bin".
  With stat="bin", it will attempt to set the y value to the count of cases in each group.
  This can result in unexpected behavior and will not be allowed in a future version of ggplot2.
  If you want y to represent counts of cases, use stat="bin" and don't map a variable to y.
  If you want y to represent values in the data, use stat="identity".
  See ?geom_bar for examples. (Defunct; last used in version 0.9.2)

那么让我们试试最后一个建议,好吗?

qplot(df[df$Freq > 2, ]$Var1, stat='identity') + geom_bar()

还好,不过有我的吧?所以,回到基础

qplot(words$word) + geom_bar() # even if geom_bar() is probably unnecessary this time

给我这个

我是疯了还是[用一长串关于 R 的漫无边际的抱怨和抱怨来代替]?

【问题讨论】:

  • 如果包含reproducible example 这样我们就可以重现情节并且咆哮并没有真正的帮助。您的话可能已被编码为因素。当您对因子进行子集化时,它们会记住所有级别(这通常是所需的行为),但如果您想忘记子集中未包含的那些,您可以使用droplevels()。所以我猜plot(droplevels(df[df$Freq &gt; 2, ])) 会起作用,但没有办法在你的数据上测试它。
  • 承认咆哮没有帮助。我没有包括一个完整的例子,因为我解释了我是如何得到它的:“我有一个直接来自文件的单词列表,每行一个,我用 read.csv 导入它会产生一个 data.frame”。我正在使用示例词汇表编辑问题。

标签: r plot histogram


【解决方案1】:

我生成一些随机数据

set.seed(1)
df <- data.frame(Var1 = letters, Freq = sample(1: 8, 26, T))

然后我使用dplyr::filter,因为它非常快速和简单。

library(ggplot2); library(dplyr)
qplot(data = filter(df, Freq > 2), Var1, Freq, geom= "bar", stat = "identity")

【讨论】:

  • 你可以在这里使用subset,得到同样的结果(subset(df, Freq&gt;2));无需加载 dplyr,尽管我同意它是一个有用的库
  • 现在,如果我输入 qplot 行,我得到的只是Error in filter(df, Freq &gt; 2) : object 'Freq' not found,但如果我使用subset,则完全没有问题。实际上,通过子集,我得到了我想要的字符。谈论不一致之处......无论如何,我将其标记为正确答案,因为它让我更接近,但为了清楚起见,如果你能阐明这个问题,那就太好了。
  • 只有两个初步猜测:1) 你确定你使用的是 dplyr::filter 而不是 stats::filter 吗? 2) 你确定你正在处理 data.frame 对象而不是矩阵(subset 适用于所有对象,而dplyr::filter 仅适用于 data.frame-type 对象)
  • 补充一下我的想法:dplyr(和data.table)函数和处理数据帧的“base R”函数之间的计算时间差异非常明显。如果一个人正在处理小型数据集,那么使用 base R 是可以的,但否则为什么要避免加载包呢?
【解决方案2】:

首先,至少对于plot(),没有理由强制使用data.frame。 plot() 理解 table 对象。你可以这样做

plot(table(words$words))
# or 
plot(table(words$words), type="p")
# or 
barplot(table(words$words))

我们可以使用Filter 来过滤行,不幸的是这会删除table 类。但是我们可以使用as.table 重新添加它。这看起来像

plot(as.table(Filter(function(x) x>2, table(words$words))), type="p")

【讨论】:

  • 好的,看,这行得通,谢谢。如果您正在学习 R 并且需要来回解决其不一致的行为,它仍然无济于事。为什么你会有一大堆等效的数据结构,根据你传递它们的任何功能的突发奇想,随意丢失和获得它们的状态?这就是您度过一个下午并最终在 SO 上咆哮的方式。
  • 我试图通过使用过滤器来变得花哨。这可能不是对表进行子集化的最常见方式。其他人可能会做tt&lt;-table(words$words);tt&lt;-tt[tt&gt;2]; barplot(tt)。但它真的无助于在这个论坛上抱怨 R。我们不会强迫你使用 R。没有语言是完美的;你只需要了解它们是如何工作的。
猜你喜欢
  • 1970-01-01
  • 2012-08-11
  • 1970-01-01
  • 2018-11-19
  • 1970-01-01
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 2020-07-08
相关资源
最近更新 更多