我有制表符分隔的文本文件,名为“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="", )
总结一下:我想在输出文件中复制相同的值而不修改它们:
答案 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.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", " ") )
# 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。