2014-12-02 2 views
3

Я работаю над фреймом данных (df), который выглядит так и может содержать более 10000 строк для некоторых случаев.grepl повторение верхнего и дополнительного символов

Object       Coding Fn Remaining 
1 T00055    T 00055_005_<002_+ 2  30 
2 T00055    T 00055_008_<002_+ 2  30 
3 E00336   E 00336_041_<001_+001_+ 3   0 
4 E00336  E 00336_041_<001_+001_+001_+ 4  10 
5 E00336  E 00336_041_<001_+001_+002_+ 4  56 
6 E00336  E 00336_041_<001_+001_+002_< 4  52 
7 T 00054 T 00054_013_<003_<015_+003_<001_< 4  52 

мне нужно grep все строки, которые содержат по крайней мере в два раза_+ в строке столбца Coding для того, чтобы получить кадр test данных.

Я пытаюсь:

test<-filter(df, 
      grepl("_[+].{2,}",Coding)) 

, который не может исключить последнюю строку. Любая идея почему? Большое спасибо

вот результаты:

Object       Coding Fn Remaining 
1 E00336   E 00336_041_<001_+001_+ 3   0 
2 E00336  E 00336_041_<001_+001_+001_+ 4  10 
3 E00336  E 00336_041_<001_+001_+002_+ 4  56 
4 E00336  E 00336_041_<001_+001_+002_< 4  52 
5 T 00054 T 00054_013_<003_<015_+003_<001_< 4  52 

ответ

0

Использование rex может сделать этот тип задачи немного проще.

df <- structure(list(Object = c("T00055", "T00055", "E00336", "E00336", 
"E00336", "E00336", "T 00054"), Coding = c("T 00055_005_<002_+", 
"T 00055_008_<002_+", "E 00336_041_<001_+001_+", "E 00336_041_<001_+001_+001_+", 
"E 00336_041_<001_+001_+002_+", "E 00336_041_<001_+001_+002_<", 
"T 00054_013_<003_<015_+003_<001_<"), Fn = c(2L, 2L, 3L, 4L, 
4L, 4L, 4L), Remaining = c(30L, 30L, 0L, 10L, 56L, 52L, 52L)), .Names = c("Object", 
"Coding", "Fn", "Remaining"), row.names = c(NA, -7L), class = "data.frame") 

subset(df, grepl(rex(at_least(group("_+", anything), 2)), Coding)) 

#> Object      Coding Fn Remaining 
#> 3 E00336  E 00336_041_<001_+001_+ 3   0 
#> 4 E00336 E 00336_041_<001_+001_+001_+ 4  10 
#> 5 E00336 E 00336_041_<001_+001_+002_+ 4  56 
#> 6 E00336 E 00336_041_<001_+001_+002_< 4  52 
+0

Либо работа аналогична, хотя функция rex приносит простоту. –

+0

Однако оба решения (Jim's и @Sven Hohenstein) не могут найти этот тип строки «T 00266_003_ + 003_ + 005_ <005_ + 043_ + 009_ <018_ <010_ + 016_ + 001_ <002_ <001_ +» или этот "T 00266/T 00554_044_ + 006_ + 003_ + 028_ + 014_ <005_ <005_ + 001_ + 003_> 002_ +" Любая идея? –

+0

Не уверен, что вы имеете в виду, 'grepl (rex (at_least (группа (« _ + », что угодно), 2)),« T 00266_003_ + 003_ + 005_ <005_ + 043_ + 009_ <018_ <010_ + 016_ + 001_ < 002_ <001_+")' -> 'TRUE' на моей машине – Jim

4

Вы можете использовать эту команду:

subset(df, grepl("(_\\+.*){2,}", Coding)) 

или, с dplyr,

filter(df, grepl("(_\\+.*){2,}", Coding)) 

Ваше текущее регулярное выражение, "_[+].{2,}", спичек _+, за которым следует не менее двух символов. Вам нужно создать группу, используя круглые скобки, чтобы правильно применить квантификатор.

+0

@ KK_63 У меня проблема с этим кодом? Почему вы больше не принимаете этот ответ? –

Смежные вопросы