制作因子变量的频率直方图
Posted
技术标签:
【中文标题】制作因子变量的频率直方图【英文标题】:Make Frequency Histogram for Factor Variables 【发布时间】:2014-03-05 13:15:07 【问题描述】:我对 R 很陌生,所以对于这样一个基本问题,我深表歉意。我花了一个小时在谷歌上搜索这个问题,但找不到解决方案。
假设我的数据集中有一些关于常见宠物类型的分类数据。我将其作为 R 中的字符向量输入,其中包含不同类型动物的名称。我是这样创建的:
animals <- c("cat", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")
我把它变成一个因子,以便在我的数据框中与其他向量一起使用:
animalFactor <- as.factor(animals)
我现在想创建一个直方图,它在 y 轴上显示每个变量的频率,在 x 轴上显示每个因子的名称,并且每个因子包含一个条形图。我尝试这段代码:
hist(table(animalFactor), freq=TRUE, xlab = levels(animalFactor), ylab = "Frequencies")
输出完全不像我期望的那样。撇开标签问题不谈,我似乎无法弄清楚如何按类别创建简单的频率直方图。
【问题讨论】:
直方图用于连续数据。你想要一个条形图。 【参考方案1】:你也可以使用lattice::histogram()
【讨论】:
多一点解释将使这个答案对 OP 和未来的用户更有用......【参考方案2】:国家是一个分类变量,我想看看数据集中出现了多少国家。换句话说,每个国家/地区有多少记录/参加者
barplot(summary(df$Country))
【讨论】:
【参考方案3】:如果您想在 ggplot
中执行此操作,则对 geom_histogram()
的 API 更改会导致错误:https://github.com/hadley/ggplot2/issues/1465
要解决这个问题,请使用geom_bar()
:
animals <- c("cat", "dog", "dog", "dog", "dog", "dog", "dog", "dog", "cat", "cat", "bird")
library(ggplot2)
# counts
ggplot(data.frame(animals), aes(x=animals)) +
geom_bar()
【讨论】:
【参考方案4】:数据作为因子可以用作绘图函数的输入。
这里给出了一个类似问题的答案: https://stat.ethz.ch/pipermail/r-help/2010-December/261873.html
x=sample(c("Richard", "Minnie", "Albert", "Helen", "Joe", "Kingston"),
50, replace=T)
x=as.factor(x)
plot(x)
【讨论】:
【参考方案5】:您得到意外结果的原因是hist(...)
从数字向量计算分布。在您的代码中,table(animalFactor)
的行为类似于具有三个元素的数字向量:1、3、7。因此,hist(...)
绘制了 1 的数量 (1)、3 的数量 (1) 和 7 的数量 (1 )。 @Roland 的解决方案是最简单的。
这是一种使用ggplot
的方法:
library(ggplot2)
ggp <- ggplot(data.frame(animals),aes(x=animals))
# counts
ggp + geom_histogram(fill="lightgreen")
# proportion
ggp + geom_histogram(fill="lightblue",aes(y=..count../sum(..count..)))
在上面的代码中使用animalFactor
而不是animals
,您会得到完全相同的结果。
【讨论】:
请参阅megatron's answer 以获取更新版本的ggplot2
。【参考方案6】:
好像你想要barplot(prop.table(table(animals)))
:
但是,这不是直方图。
【讨论】:
如果你只是做barplot(table(animals))
,你会得到这个更像直方图,即没有标准化的计数。以上是关于制作因子变量的频率直方图的主要内容,如果未能解决你的问题,请参考以下文章