结果不同grep()和“ ==”

时间:2019-11-02 12:26:28

标签: r string grep match

我有以下虚拟data.frame:

setseed(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)))

我想知道data.frame包含多少个NA,要么为字符串“ NA”,要么为缺失值NA。 为了进行测试,我运行了以下几行:

print(length(grep("\\<NA\\>", df)))
print(length(which(is.na(df))))
print(length(which(df=="NA")))

将NA引入为缺失值:

df1.na$x1[rbinom(33,1,0.1)==1]<-"NA"
df1.na$x2[rbinom(33,1,0.1)==1]<-NA
df1.na$x3[rbinom(33,1,0.1)==1]<-NA
df1.na$x4[rbinom(33,1,0.1)==1]<-NA
df1.na$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”时返回相同的答案,但是它们差别很大,我也不知道为什么。哪个更好?我注意到对于更大的data.frames(2.000.000x 30)grep()需要很长时间。还有更快的选择吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

@override Widget build(BuildContext context) { final auth = Provider.of<Auth>(context); return Container( child: Text(auth.uid); ); } 除了速度较慢之外,没有提供您想要的结果。它不提供匹配的像元数,而是给出转换为type:character时匹配print(length(grep("\\<NA\\>", df)))的列数。

所以

\<NA\>

肯定更好。

要考虑的另一种选择:将字符列转换为数字,然后仅使用print(length(which(df=="NA")))

is.na