2014-01-16 7 views
0

У меня есть матрица, которая включает в себя 4 и шестизначные числа, которые в основном состоят из 2 или 3 пар цифр, описывающих перекрывающиеся фигуры. Так, например,Выбор двух цифр из 4 или шестизначного числа в R

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), и выбор в data2 даст (FALSE, FALSE, FALSE, TRUE, TRUE). Я попытался создать список уникальных двухзначных чисел, которые я ищу, и используя grepl, чтобы выбрать те, которые соответствуют шаблону, но из-за нулей, которые находятся в матрице, представляющей пустые значения, grepl выбирает слишком много клетки; например, ищет 40 в data1 даст (TRUE, FALSE, TRUE,TRUE, TRUE, TRUE).

+1

Я думаю, что вы делаете это слишком сложным для себя. как насчет размещения разделителей между парами, таких как «-», чтобы вы не получили ложное совпадение? или заменить значения 00 на xx? – 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