R语言数据框子集化绘制直方图报错:'x' must be numeric
问题原因与解决办法
这问题我之前踩过坑!核心原因大概率是你的数据框不是普通的data.frame,而是带特殊属性的子类(比如tibble或者data.table)——两种取列方式返回的对象类型不一样,才导致了这个矛盾的报错:
为什么会出现这个差异?
- 当你用
df[,"col1"]时:如果是tibble这类子类,这种索引方式返回的是单列的数据框(比如tbl_df类型),而hist()函数要求输入必须是数值向量,不是数据框对象,所以才会抛出'x' must be numeric的错误——其实不是列里的值不是数值,而是输入的对象类型不符合要求! - 而
df$col1的取法:不管是普通data.frame还是tibble,都会直接返回数值向量,完全符合hist()的参数要求,所以能正常生成直方图。 - 箱线图没问题的原因:
boxplot()函数本身兼容数据框和向量两种输入类型,所以两种取列方式都能被正确识别。
快速解决方法
你可以任选以下一种方式解决:
- 用
[[索引替代[:hist(df[["col1"]]),这种方式不管数据框是什么类型,都会返回数值向量,效果和$完全一致。 - 给
[索引加drop=TRUE参数:hist(df[,"col1", drop=TRUE]),强制将单列数据框转换为向量。 - 如果是
tibble,可以用dplyr的pull()函数:hist(dplyr::pull(df, col1)),专门用来从tibble中提取向量。
验证问题的小技巧
你可以先打印两种取列方式的类型,确认问题:
class(df[,"col1"]) # 会输出 "tbl_df" 或 "data.frame" class(df$col1) # 会输出 "numeric"
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

