从R中的4位或6位数字中选择两位数字



我有一个矩阵,它包括4位和6位数字,基本上由2或3对数字组成,描述重叠的形状。例如,

data1<-cbind(474440,470000,440000,40000,404400,474000).

矩阵的每个单元都有474440或以上的一些组合,其余的数字为零。我有另一个类似的数据集,但只有两对数字,而不是三对。例如,

data2<-cbind(5253,5200,5300,50000,5053).

同样,该组合包含525350或其一些组合。我希望能够为两位数中的每一个选择一个逻辑矩阵,因此在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相匹配。

最新更新