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

时间:2014-01-16 06:49:45

标签: regex r select grepl

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

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

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

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

此外,此组合包含525350或其某种组合。我希望能够为两个数字中的每一个选择一个逻辑矩阵,因此在40中选择data1会产生(TRUE,FALSE,FALSE,TRUE,TRUE,TRUE),并在50中选择data2 {1}}会产生(FALSE, FALSE, FALSE, TRUE, TRUE)。我已经尝试创建一个我正在寻找的唯一两位数字的列表,并使用grepl来选择那些匹配模式的数字,但由于矩阵中的零代表空值,grepl选择了太多的细胞;例如,在40中查找data1会产生(TRUE, FALSE, TRUE,TRUE, TRUE, TRUE)

2 个答案:

答案 0 :(得分:2)

#   ...........      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    

答案 1 :(得分:1)

您可以将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中,^是字符串的开头。 (..)由两个字符组成。量词*表示0次或多次。 40只意味着文字40。因此,这匹配40前面正好是零,两个,四个等字符。