r语言 - 不同的结果 grep() 和 "=="



我有以下伪数据。帧:

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

最新更新