R: 当文件中存在NULL时,如何读取文件,使其转为NA?
文件如下(case.txt):
charCol floatCol intCol
1: a 1.5 10
2: b NULL 3
3: c 3.9 NULL
4: d -3.4 4
1.常用读取方式
> require(data.table)
> x<-fread("case.txt")
> x
charCol floatCol intCol
1: a 1.5 10
2: b NULL 3
3: c 3.9 NULL
4: d -3.4 4
> str(x) #你会发现 含有NULL数值的那一行都转变为了字符串类型,而NULL代表的含义应该是missing value,应该是NA
Classes ‘data.table’ and 'data.frame': 4 obs. of 3 variables:
$ charCol : chr "a" "b" "c" "d"
$ floatCol: chr "1.5" "NULL" "3.9" "-3.4"
$ intCol : chr "10" "3" "NULL" "4"
- attr(*, ".internal.selfref")=<externalptr>
2.正确做法
> y<-fread("case.txt",na.strings = "NULL") #加一个na.string="NULL"即可
> y
charCol floatCol intCol
1: a 1.5 10
2: b NA 3
3: c 3.9 NA
4: d -3.4 4
> y[,lapply(.SD,typeof)] #这样的话,第二列第三列的类型就不是字符类型了
charCol floatCol intCol
1: character double integer
3.R中的NA和NULL
- NA代表 这个值是缺失值
- NULL 代表这个值不存在,这个值是个空值(NULL is often returned by expressions and functions whose values are undefined.)
如下例
> c(1,2,3,NULL,4)
[1] 1 2 3 4
> c(1,2,3,NA,4)
[1] 1 2 3 NA 4
由上可得:
- 可以看出NA是有长度属性的。
length(NA)=1
而length(NULL)=0
- 与两者相关的函数有
is.na(),is.null(),as.null等
4. 易犯错误
- 用
x==NA
或者x=NULL
来判断一个数值是不是NA
或者NULL
如下:
> x=NA
> ifelse(x==NA,print(1),print(0))
[1] NA
> y<-NULL
> ifelse(y==NULL,1,0)
logical(0)
这样是判断不出来的。正确做法应为:
> ifelse(is.na(x),1,0)
[1] 1
> ifelse(is.null(y),1,0)
[1] 1