【问题标题】:read.csv converting empty character column to NAread.csv 将空字符列转换为 NA
【发布时间】:2019-06-22 01:03:29
【问题描述】:

例子:

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 列是空字符串,但它被转换为 NA_logical_,尽管它是一个带引号的字段 (quote=T)。我找不到可以让我将 X 列读取为空字符串的参数。 data.table 和 readr 也会出现问题。

为什么会这样?

编辑:我主要是在寻找为什么会发生这种情况的解释,而不是解决方案。

【问题讨论】:

  • 我认为简短的回答是,当没有指定变量类型时,R 必须猜测。空字符串是不明确的(可能意味着空字符串或缺失值),因此 R 默认为“最低”类型,即logical。也许对 R 内部有深入了解的人可以详细说明。

标签: r csv data.table readr


【解决方案1】:

您可以将colClasses 参数更改为read.csv:

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::read_csv("/tmp/temp.txt", col_types = list(col_character(), col_double()))。漏洞?另外,为什么我需要这样做?如果我不提前知道列怎么办?
  • 看起来readr::read_csv 给你NA_character_ 而不是空字符串(即使没有列规范)。我认为这是一个功能而不是一个错误。如果您不提前知道这些列,您始终可以在读入数据后应用转换。
猜你喜欢
  • 2013-10-08
  • 1970-01-01
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多