base R绘制数据框列子集直方图提示$运算符无效如何解决
报错原因
$ operator is invalid for atomic vectors 报错的核心原因是:你运行绘图代码时,当前环境中的df对象已经不再是之前构造的data.frame类型,被意外覆盖成了原子向量(一维的数值/字符/逻辑向量都属于原子向量,这类对象不支持用$符号提取子元素)。
你可以先运行以下代码验证对象类型:
class(df)
如果返回值不是data.frame,就说明对象确实被覆盖了——常见的误操作包括之前运行过把df赋值为某一列向量的代码、加载其他内容时同名对象覆盖了自定义数据框等。
base R 可行解决方案
第一步:恢复正确的测试数据框
如果df已经被覆盖,重新运行构造代码即可:
a <- c(1:100) b <- c(101:200) c <- rep("A", 100) df <- data.frame(a, b, c)
第二步:选择任意一种base R写法绘制直方图
以下写法都不需要依赖第三方包,可直接运行:
- 写法1:
$提取列后直接筛选(数据框状态下该写法完全合法)
hist(df$a[df$a < 40])
- 写法2:双中括号按列名提取,比
$的容错性更高
hist(df[["a"]][df[["a"]] < 40])
- 写法3:先用
subset筛选符合条件的行,再提取目标列绘图
sub_data <- subset(df, a < 40) hist(sub_data$a)
- 写法4:用
with绑定数据框环境,代码更简洁
with(df, hist(a[a < 40]))
小提示:日常写代码尽量不要用
df这类过于通用的变量名,能大幅降低自定义对象被意外覆盖的概率。
内容的提问来源于stack exchange,提问作者Takanashi
相关产品推荐
相关产品推荐

