You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

R中read.csv设stringsAsFactors=T时table函数出现额外0计数的原因

为什么stringsAsFactors = TRUE时table()会出现额外的0计数?

这是因为因子(factor)的水平(levels)在读取阶段就被固定了,哪怕之后你移除了包含该水平的行,因子的水平列表依然会保留这个值。

具体原因拆解:

当你设置stringsAsFactors = TRUE读取CSV时,R会自动把字符类型的列转换成因子。你的原CSV第二行的Column列值是0,所以在读取过程中,R会把0加入到这个因子列的水平集合里。虽然你之后用[-2,]跳过了第二行,但因子的水平已经被初始化包含0了。

而table()函数统计因子时,会枚举该因子的所有预定义水平——哪怕某个水平在当前数据中没有对应的值,也会显示出来并计数为0。这就是你看到额外0条目的核心原因。

当你改成stringsAsFactors = FALSE时,该列会被读取为普通的字符向量,没有预定义的水平集合,table()只会统计数据中实际存在的唯一值,结果自然就正常了。

对应你的示例验证:

看你提供的控制台输出:

> df = read.csv('sample.csv', header = T, stringsAsFactors = T)[-2,]
> df
  Plot   Column
1 first column1
3 second column2
4  third column3
5 fourth column4
> table(df$Column)
0 column1 column2 column3 column4 
0       1       1       1       1 

此时你用levels(df$Column)查看,会发现它包含"0"、"column1"、"column2"等所有初始读取时出现过的取值。

而用stringsAsFactors = FALSE读取时:

> df1 = read.csv('sample.csv', header = T, stringsAsFactors = F)[-2,]
> table(df1$Column)
column1 column2 column3 column4 
      1       1       1       1 

df1$Column是字符向量,没有预定义水平,所以table()只统计实际存在的值。

解决办法

  1. 推荐:使用默认读取方式(从R 4.0.0版本开始,read.csv的stringsAsFactors默认值已经是FALSE,直接读取即可):
    df = read.csv("filename.csv", header = TRUE)[-2,]
    
  2. 如果已经是因子类型,可以用droplevels()移除不存在的水平后再统计:
    table(droplevels(df$Column))
    

内容的提问来源于stack exchange,提问作者Mohit Sharma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:44:38