我有一个包含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
或其某种组合。我希望能够为两个数字中的每一个选择一个逻辑矩阵,因此在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)
。
答案 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
前面正好是零,两个,四个等字符。