读取带空格的 csv 设置字段到 NA

read csv setting fields with spaces to NA

我有一个如下所示的 csv 文件:

A, B,  C, 
1, 2 1, 3,
3, 1, 0, 
4, 1, 0 5,
 ...

是否可以设置 na.string 以将所有带有 space 的字段分配给 NA(例如 regex function(x){x[grep(patt="\ ", x)]<-NA;x}),即

A, B, C,
1, NA, 3,
3, 1, 0,
4, 1, NA,

我们可以遍历列并通过转换为 numeric

将其设置为 NA
df1[] <- lapply(df1, as.numeric)

注意:在这里,我假设列是 character class。如果是factor,则执行lapply(df1, function(x) as.numeric(as.character(x)))

我不知道这在 中会如何转换,但我会使用以下正则表达式来匹配包含 spaces 的字段:

[^, ]+ [^, ]+

即:

  • 除逗号或 space ([^, ]+)
  • 之外的一些字符
  • 后跟 space (</code>)</li> <li>以及除逗号或 space (<code>[^, ]+)
  • 以外的其他字符

您可以看到它的实际效果 here

@akrun 答案的变体(我喜欢)。

library(dplyr)
read.csv("test.csv", colClasses="character") %>% mutate_each(funs(as.numeric))

假设所有列都是 character,这将读取文件,然后将所有列转换为 numericmutate_each 来自 dplyr

在读取调用中使用 colClasses="numeric" 无效(我不知道为什么 :( ),因为

> as.numeric("2 1")
[1] NA

How to read data when some numbers contain commas as thousand separator? 我们了解到我们可以创建一个新函数来进行转换。

setAs("character", "numwithspace", function(from) as.numeric(from) )
read.csv("test.csv", colClasses="numwithspace")

这给出

  A  B  C
1 1 NA  3
2 3  1  0
3 4  1 NA