我有一个矩阵,它包括4位和6位数字,基本上由2或3对数字组成,描述重叠的形状。例如,
data1<-cbind(474440,470000,440000,40000,404400,474000).
矩阵的每个单元都有47
、44
、40
或以上的一些组合,其余的数字为零。我有另一个类似的数据集,但只有两对数字,而不是三对。例如,
data2<-cbind(5253,5200,5300,50000,5053).
同样,该组合包含52
、53
、50
或其一些组合。我希望能够为两位数中的每一个选择一个逻辑矩阵,因此在data1
中选择40
将产生(TRUE,FALSE,FALSE,TRUE,TRUE,TRUE)
,在data2
中选择50
将产生(FALSE, FALSE, FALSE, TRUE, TRUE)
。我尝试创建一个我正在寻找的唯一两位数的列表,并使用grepl来选择那些匹配模式的数字,但由于矩阵中的零表示空值,grepl选择了太多的单元格;例如在data1
中查找40
将产生(TRUE, FALSE, TRUE,TRUE, TRUE, TRUE)
。
# ........... look for 40 in ....... split string into pairs
apply(data1,2,function(x)40 %in% strsplit(gsub("([[:alnum:]]{2})", "\1 ", x), " ")[[1]])
[1] TRUE FALSE FALSE TRUE TRUE TRUE
您可以将grepl
与正确的正则表达式一起使用。函数format
避免用科学的数字表示法是必要的。
data1<-cbind(474440,470000,440000,400000,404400,474000)
grepl("^(..)*40", format(data1))
# [1] TRUE FALSE FALSE TRUE TRUE TRUE
data2<-cbind(5253,5200,5300,5000,5053)
grepl("^(..)*50", format(data2))
# [1] FALSE FALSE FALSE TRUE TRUE
它是如何工作的
在正则表达式^(..)*40
中,^
是字符串的开头。CCD_ 20由两个字符组成。量词*
表示0或多次。40
只是字面意义上的40
。因此,这与前面正好有零个、两个、四个等字符的40
相匹配。