使用REGEX过滤gre中的数据帧的grepl()子集()

时间:2017-01-31 22:59:30

标签: r regex subset grepl

我正在学习R并尝试使用Regex的subset()和grepl()来过滤数据帧。我创建了一个非常小的数据框:

x   y   z   w
1   10  a   k
2   12  b   l
3   14  c   m
4   16  d   n
5   18  e   o

我的代码如下:

subset(df14, grepl('^c | [l - n]', c(df14$z , df14$w) ), grepl('[yz]', colnames(df14)) )

在我看来,第二个参数应该返回grepl()找到的行的索引,以匹配名称为'z'或'w'的列中的模式。但是,这不是发生的情况(返回带有y和z列的空数据帧)。

我希望返回2,3,4行,因为列'w'包含[ln]正则表达式模式中指定的字母l,m,n以及列z和w,因为这些名称与正则表达式匹配[yz ]在子集()的第三个参数中。

(我怀疑它正在寻找列名称中的匹配而不是列的内容,这是我感兴趣的。)

显然,我对结果本身并不感兴趣。这是一个了解功能如何工作的实验。所以,我正在寻找的是解释特定代码的解释和方法 - 而不是替代解决方案。

您的建议将不胜感激。

2 个答案:

答案 0 :(得分:1)

有各种各样的问题。

一个问题是模式中的额外空格。删除它们或使用自由间距修饰符(?x)perl = TRUE。无论哪种方式,你必须摆脱字符类中的空格。 [l-n]匹配" m" [l - n]即使(?x)也没有。您可以阅读有关自由间距修改器及其对字符类here内外的影响的更多信息。

另一个问题是,在您的第一个grepl中,您要在长度为10的向量(字符向量?我们无法从示例中说明)中进行搜索。在该向量中,什么是真的?第6个位置意味着5行data.frame?返回5行数据帧的第6行没有意义。相反,你可以看到你的模式是否找到了列" w"或(|)栏" z"。查看每列,而不是列的串联。

另一个问题出在你的第二个grepl," w"与[yz]不匹配。如果要选择名称中包含" w"的列。或者" z",一种方式是[wz]

不需要^锚点,因为你的所有字符串都包含一个字符,但我还是会留下它:

subset(df14, 
       subset = grepl('^c|[l-n]', df14$z) | 
           grepl('^c|[l-n]', df14$w),
       select = grepl('[wz]', colnames(df14)))
#  z w
#2 b l
#3 c m
#4 d n

或使用自由间距模式修改器和第二个[wz]的不同模式(w|z vs grepl):

subset(df14, 
       subset = grepl('(?x)^c | [l-n]', df14$z, perl = TRUE) | 
           grepl('(?x)^c | [l-n]', df14$w, perl = TRUE),
       select = grepl('w|z', colnames(df14)))
#  z w
#2 b l
#3 c m
#4 d n

答案 1 :(得分:0)

'^c | [l - n]'搜索表达式在这些列中找不到任何内容。此外,更直观的方法是使用[ , ]来执行此类子集。请参阅http://adv-r.had.co.nz/Subsetting.html