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()只统计实际存在的值。
解决办法
- 推荐:使用默认读取方式(从R 4.0.0版本开始,
read.csv的stringsAsFactors默认值已经是FALSE,直接读取即可):df = read.csv("filename.csv", header = TRUE)[-2,] - 如果已经是因子类型,可以用
droplevels()移除不存在的水平后再统计:table(droplevels(df$Column))
内容的提问来源于stack exchange,提问作者Mohit Sharma
相关产品推荐
相关产品推荐

