Python导出CSV至R:空白值转缺失值及NaN数量差异问题
我来帮你一步步解决这两个问题:
1. 让R正确识别CSV中的空白为缺失值
Python导出CSV时,DataFrame里的NaN会被存成空单元格,但R默认导入时,不会把所有空单元格都当成缺失值(NA)——这取决于列的数据类型和导入函数的参数。你可以用两种方法解决:
基础R的
read.csv():必须指定na.strings参数,把空字符串和常见的缺失标记都包含进去,这样R会自动把这些内容转换成NA:df <- read.csv("你的文件路径.csv", na.strings = c("", "NA"))tidyverse的
read_csv()(更推荐,因为默认处理更智能):它默认就会把空单元格识别为NA,如果有特殊缺失标记,也可以用na参数补充:library(readr) df <- read_csv("你的文件路径.csv", na = c("", "NA"))
2. 为什么缺失值数量和Python里差这么多?
你遇到的sum(is.na(df))=9但Python里有3545个NaN,大概率是这几个原因:
- 导入时没设置缺失值参数:如果直接用默认的
read.csv()导入,R只会把数值型列里的空单元格转成NA,而字符型列里的空单元格会被保留成空字符串(""),is.na()是不会统计这些空字符串的——这就导致大部分缺失值没被算进去。 - 列类型被自动转换:R导入时可能把一些本该是数值型的列转换成了字符型(比如列里有混合的数字和文本),这些列里的空单元格就变成了
"",同样不会被is.na()识别。
你可以验证一下:先运行str(df)查看各列的数据类型,再用sum(df == "")统计字符型空字符串的数量,把这个数加上sum(is.na(df)),应该就和Python里的3545接近了。
另外你提到的isblank(df) <- NaN是不存在的R命令,事后处理空字符串的话可以用这段代码,但还是建议从导入环节解决更高效:
# 把所有列里的空字符串替换成NA df[] <- lapply(df, function(col) ifelse(col == "", NA, col))
内容的提问来源于stack exchange,提问作者Chris
相关产品推荐
相关产品推荐

