read.csv空白字段为NA

时间:2013-10-01 21:03:10

标签: r read.csv

我有制表符分隔的文本文件,名为“a.txt”。 D列是空的。

 A       B       C    D
10      20     NaN
30              40
40      30      20
20      NA      20

我希望数据框看起来和文本文件完全相同,第二行和第二列中有空格。

不幸的是,read.csv正在将所有空白和NA转换为“NA”。我想把NA和NaN作为字符阅读。

 b<- read.csv("a.txt",sep="\t", skip =0, header = TRUE, comment.char = "",check.names = FALSE, quote="", )

总结一下:我想在输出文件中复制相同的值而不修改它们:

  • 如果输入中有空白,则输出应为空白。
  • 如果输入具有NA或Nan,则输出也应具有NA或NaN。

4 个答案:

答案 0 :(得分:32)

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.delimread.table

b<- read.table("a.txt", sep="\t" skip =0, header = TRUE, 
               comment.char = "",check.names = FALSE, quote="",
               na.strings=c("NA","NaN", " ") )

# worked example for csv text file connection
 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

答案 1 :(得分:10)

阅读csv文件后,请尝试以下操作。它将用“”替换NA值。

b[is.na(b)]<-""

相当肯定不会修复你的NaN值。这需要在单独的声明中解决

b[is.nan(b)]<-""

答案 2 :(得分:2)

您可以在colClasses语句中指定read.csv,将列作为文本读取。

答案 3 :(得分:0)

使用na.string参数。
na.string用于定义要从数据中读取的na值的参数。所以,如果你提到

read.csv(text=bt, na.string = "abc")

然后在你的数据中,abc将把它转换为na 由于在您的数据中找不到abc,因此不会将任何值转换为na。