1

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

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

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

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

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

4

2 回答 2

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    
于 2014-01-16T07:40:19.327 回答
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 次或多次。just表示40字面意思。40因此,此匹配40之前正好有零、二、四等字符。

于 2014-01-16T08:03:23.877 回答