晚些时候编辑:在编辑和扩展评论之后重新阅读此内容后,我想知道所需的内容(或至少要求的内容)是否与我下面建议的完全相反。这个请求:
不幸的是,read.csv将所有空白和NA转换为“NA”。 我想将NA和NaN读取为字符。
可能已经通过参数得到了满足:`colClasses="character",stringsAsFactors=FALSE,na.strings="."`
然后,任何包括空字符串在内的字符值都会以其本身出现。 反对这一点的是接受将空字符值(“”)转换为R `_NA_character`值的答案。
以下是带有各种结果的测试示例:
sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', na.strings=""), class )
sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', na.strings="x"), class )
sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', na.strings="x", stringsAsFactors=FALSE), class )
sapply(read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t',
read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', colClasses="character", stringsAsFactors=FALSE)
read.csv(text='A\tB\tC\tD\na\t""\tNA\tNaN', sep='\t', colClasses="character", stringsAsFactors=FALSE,na.strings=".")
na.strings 的默认值只是 "NA",因此您可能需要添加 "NaN"。真正的空白 ("") 会被设置为缺失值,但空格 (" ") 不会:
b<- read.csv("a.txt", skip =0,
comment.char = "",check.names = FALSE, quote="",
na.strings=c("NA","NaN", " ") )
由于您的数据示例格式不正确且没有逗号,因此不清楚这是否是问题。这可能是根本问题,因为read.csv不允许使用制表符分隔。如果您的数据使用制表符分隔,请使用read.delim
或read.table
。
b<- read.table("a.txt", sep="\t" skip =0, header = TRUE,
comment.char = "",check.names = FALSE, quote="",
na.strings=c("NA","NaN", " ") )
bt <- "A,B,C
10,20,NaN
30,,40
40,30,20
,NA,20"
b<- read.csv(text=bt, sep=",",
comment.char = "",check.names = FALSE, quote="\"",
na.strings=c("NA","NaN", " ") )
b
A B C
1 10 20 NA
2 30 NA 40
3 40 30 20
4 NA NA 20
示例2:
bt <- "A,B,C,D
10,20,NaN
30,,40
40,30,20
,NA,20"
b<- read.csv(text=bt, sep=",",
comment.char = "",check.names = FALSE, quote="\"",
na.strings=c("NA","NaN", " ") , colClasses=c(rep("numeric", 3), "logical"))
b
A B C D
1 10 20 NA NA
2 30 NA 40 NA
3 40 30 20 NA
4 NA NA 20 NA
> str(b)
'data.frame': 4 obs. of 4 variables:
$ A: num 10 30 40 NA
$ B: num 20 NA 30 NA
$ C: num NA 40 20 20
$ D: logi NA NA NA NA
有趣的是,在数值向量中 NA 和 NaN 并不相同。NaN 是由没有数学意义的运算返回的(但是如在?NaN
的帮助页面中所述,操作的结果可能取决于特定的操作系统)。对于 NaN 或 NA,等号测试都不适用。它们各有特定的 is
函数:
> Inf*0
[1] NaN
> is.nan(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE TRUE FALSE
> is.na(c(1,2.2,3,NaN, NA) )
[1] FALSE FALSE FALSE TRUE TRUE # note the difference