read.csv将空字符列转换为NA

3

例子:

x <- data.frame(X = c("",""), Y=1:2, stringsAsFactors = F)
write.csv("/tmp/temp.txt", row.names=F, quote=T)

read.csv("/tmp/temp.txt")
   X Y
1 NA 1
2 NA 2

readr::read_csv("/tmp/temp.txt", col_types = list(col_character(), col_double()))
  X         Y
  <chr> <dbl>
1 NA        1
2 NA        2

我希望X列是空字符串,但即使是具有引号(quote=T)的字段,它也被转换为NA_logical_。我找不到任何参数让我将X列读取为空字符串。这个问题也发生在data.table和readr中。
为什么会发生这种情况?
编辑:我主要想知道为什么会发生这种情况,而不是解决方案。

我认为简短的答案是,当变量类型未指定时,R必须猜测。空字符串是有歧义的(可能表示空字符串或缺失值),因此R默认使用“最低”类型,即logical。也许对R内部有深入了解的人可以详细说明。 - neilfws
1个回答

2
你可以修改read.csv函数的colClasses参数:
x <- read.csv("/tmp/temp.txt", colClasses = c(X = "character"))
str(x)
#'data.frame':  2 obs. of  2 variables:
# $ X: chr  "" ""
# $ Y: int  1 2

它不能与 readr 一起使用:readr::read_csv("/tmp/temp.txt", col_types = list(col_character(), col_double()))。这是个错误吗?另外,我为什么需要这样做呢?如果我事先不知道列数会怎样? - thc
看起来 readr::read_csv 给你的是 NA_character_ 而不是空字符串(即使没有列规范)。我认为这是一种特性而不是错误。如果您事先不知道列,您可以在读取数据后始终应用转换。 - dave-edison

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接