我有以下伪数据。帧:
set.seed(666)
df<-data.frame(ID=rep(c("A","B","C"),each=11),Year=rep(2010:2020,each=1,3),x1=floor(runif(33,0,10)),x2=floor(runif(33,0,2)),
x3=floor(runif(33,1,100)),x4=floor(runif(33,1,100)),x5=floor(runif(33,1,100)))
我想知道有多少NA——要么是字符串";NA";或缺少数据帧包含的值NA。为了测试,我运行以下行:
print(length(grep("\<NA\>", df)))
print(length(which(is.na(df))))
print(length(which(df=="NA")))
引入NA作为缺失值:
df$x1[rbinom(33,1,0.1)==1]<-"NA"
df$x2[rbinom(33,1,0.1)==1]<-NA
df$x3[rbinom(33,1,0.1)==1]<-NA
df$x4[rbinom(33,1,0.1)==1]<-NA
df$x5[rbinom(33,1,0.1)==1]<-NA
与上述相同的线的结果从2到5不等。Is.na((对缺少的值很有效。但是字符串匹配似乎被取消了,正如你在下面看到的:
print(length(grep("\<NA\>", df)))
print(length(which(is.na(df))))
print(length(which(df=="NA")))
我希望grep((和"="以在查找字符串"时返回相同的答案;NA";,但是他们差别很大,我不知道为什么。哪一个更好?我注意到对于较大的数据。frames(2.000.000x30(grep((需要很长时间。有更快的选择吗?
谢谢。A.很多!
除了速度较慢之外,print(length(grep("\<NA\>", df)))
不会给出您想要的结果。它给出的不是匹配的单元格数,而是转换为type:character时与<NA>
匹配的列数。
所以
print(length(which(df=="NA")))
肯定更好。
附录:正如@Onyambu在下面的评论中指出的那样,使用sum比打印长度which更简单。这给出了NA或"NA"的细胞总数;NA";,例如
sum(is.na(df))
sum(df=="NA")
# total:
sum(is.na(df)|df=="NA")