3

我正在处理一个df看起来像这样的数据框 ( ),在某些情况下可以包含超过 10000 行。

   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包含至少两次的所有行才能获得数据框。_+Codingtest

我在尝试 :

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
4

2 回答 2

4

你可以使用这个命令:

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

或者,与dplyr

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

您当前的正则表达式 ,"_[+].{2,}"匹配_+后跟至少两个字符。您需要使用括号创建一个组才能正确应用量词。

于 2014-12-02T15:05:11.990 回答
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
于 2014-12-03T21:38:06.050 回答