绘图问题 - 将因子变量错误处理为数字
Plotting problems - mishandling factor variable as numeric
我不完全确定如何命名我在 R 中的绘图功能中遇到的问题...
在我的原始数据集中,我有一个名为 age 的变量,具有以下级别:15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、2X , 30, 40, 50, 60. 当我绘制年龄时使用:
plot(age, xlab="Age", ylab="Number of observations")
然后我会得到这个图(一个条形图,x 轴是年龄,y 轴是观察次数):
然后我从数据中删除了 2X(对于 20 多岁的人)并使用与上面相同的代码来获取新图。当我重新 运行 代码时,情节现在看起来像这样(y 轴上有年龄的情节):
如果有人对为什么情节现在在 y 轴上显示年龄有任何想法,请告诉我!预先感谢您的帮助!
诊断
您遇到了 S3 方法分派问题。 plot
是通用函数:
methods(plot)
# [1] plot.acf* plot.data.frame* plot.decomposed.ts*
# [4] plot.default plot.dendrogram* plot.density*
# [7] plot.ecdf plot.factor* plot.formula*
#[10] plot.function plot.hclust* plot.histogram*
#[13] plot.HoltWinters* plot.isoreg* plot.lm*
#[16] plot.medpolish* plot.mlm* plot.ppr*
#[19] plot.prcomp* plot.princomp* plot.profile.nls*
#[22] plot.raster* plot.spec* plot.stepfun
#[25] plot.stl* plot.table* plot.ts
#[28] plot.tskernel* plot.TukeyHSD*
上面的评论要求您在删除 2X
之前和之后提供 str(age)
,因为此类信息有助于判断在调用 plot
时调度了哪个方法。
当您有 2X
数据时,age
绝对是一个因素。因此,当您调用 plot
时,将调用 plot.factor
并生成条形图。
而当您删除 2X
时,似乎 age
不知何故变成了一个数值变量。因此,当您调用 plot
时,将调用 plot.default
并生成散点图,在这种情况下 plot(age)
本质上是在执行 plot.default(1:length(age), age)
.
解决方案
一种肯定有效的方法是
plot(factor(age), xlab="Age", ylab="Number of observations")
不过,我还是很好奇你是怎么去掉2X
子集,让age
变成数字的。通常,如果 age
是 R 中的因子变量,则删除子集不会更改变量 class.
大概 age
存储在 .txt
或 .csv
文件中,您可以通过 scan()
、read.table()
或 read.csv()
读取它。当您删除 2X
时,您在这些文件中删除了它们并再次将数据读入 R。这样R会在数据读入的时候将age
识别为不同的class
我不完全确定如何命名我在 R 中的绘图功能中遇到的问题...
在我的原始数据集中,我有一个名为 age 的变量,具有以下级别:15、16、17、18、19、20、21、22、23、24、25、26、27、28、29、2X , 30, 40, 50, 60. 当我绘制年龄时使用:
plot(age, xlab="Age", ylab="Number of observations")
然后我会得到这个图(一个条形图,x 轴是年龄,y 轴是观察次数):
然后我从数据中删除了 2X(对于 20 多岁的人)并使用与上面相同的代码来获取新图。当我重新 运行 代码时,情节现在看起来像这样(y 轴上有年龄的情节):
如果有人对为什么情节现在在 y 轴上显示年龄有任何想法,请告诉我!预先感谢您的帮助!
诊断
您遇到了 S3 方法分派问题。 plot
是通用函数:
methods(plot)
# [1] plot.acf* plot.data.frame* plot.decomposed.ts*
# [4] plot.default plot.dendrogram* plot.density*
# [7] plot.ecdf plot.factor* plot.formula*
#[10] plot.function plot.hclust* plot.histogram*
#[13] plot.HoltWinters* plot.isoreg* plot.lm*
#[16] plot.medpolish* plot.mlm* plot.ppr*
#[19] plot.prcomp* plot.princomp* plot.profile.nls*
#[22] plot.raster* plot.spec* plot.stepfun
#[25] plot.stl* plot.table* plot.ts
#[28] plot.tskernel* plot.TukeyHSD*
上面的评论要求您在删除 2X
之前和之后提供 str(age)
,因为此类信息有助于判断在调用 plot
时调度了哪个方法。
当您有 2X
数据时,age
绝对是一个因素。因此,当您调用 plot
时,将调用 plot.factor
并生成条形图。
而当您删除 2X
时,似乎 age
不知何故变成了一个数值变量。因此,当您调用 plot
时,将调用 plot.default
并生成散点图,在这种情况下 plot(age)
本质上是在执行 plot.default(1:length(age), age)
.
解决方案
一种肯定有效的方法是
plot(factor(age), xlab="Age", ylab="Number of observations")
不过,我还是很好奇你是怎么去掉2X
子集,让age
变成数字的。通常,如果 age
是 R 中的因子变量,则删除子集不会更改变量 class.
大概 age
存储在 .txt
或 .csv
文件中,您可以通过 scan()
、read.table()
或 read.csv()
读取它。当您删除 2X
时,您在这些文件中删除了它们并再次将数据读入 R。这样R会在数据读入的时候将age
识别为不同的class