2014-01-16 28 views
0

我有一个包含4位和6位数字的矩阵,它们基本上由2或3对数字组成,描述重叠的形状。因此,举例来说,从R中的4位或6位数中选择两位数

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

所述矩阵的每个单元具有一个或者47,一个44,一个40,或上述的一些组合,并且数量的其余部分是零。我有另一个类似的数据集,但只有两对数字,而不是三对。因此,举例来说,

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)

+1

我觉得你让自己太难了。如果你把分隔符放在两个对之间,比如“ - ”,那么你不会得到一个错误的匹配?或用xx替换00值? – Eccountable

+0

关于[将一个字符串拆分为子字符串]的这个问题可能有用(http://stackoverflow.com/questions/11619616/how-to-split-a-string-into-substrings-of-a-given-length)给你。 – thelatemail

+0

警告:请记住'grep,gsub'函数家族将数字强制为字符。例如,'data <-474.4400e7; grepl('444',data)'会返回'TRUE'(除非你用'format'做了一些坏事,就像Sven暗示的那样)。 –

回答

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前面是精确的零,二,四等字符。

+0

非常有帮助,谢谢!感谢您的非常明确的解释。正是我在找什么。 – Alexandra

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  
+0

我想通过某种字符串拆分功能可以做到这一点,但我无法完全理解它。感谢您的建议。 – Alexandra