当文件中存在NULL时,如何读取文件,使其转为NA?

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")= 

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)=1length(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

你可能感兴趣的:(r语言)