我正在学习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 ]在子集()的第三个参数中。
(我怀疑它正在寻找列名称中的匹配而不是列的内容,这是我感兴趣的。)
显然,我对结果本身并不感兴趣。这是一个了解功能如何工作的实验。所以,我正在寻找的是解释特定代码的解释和方法 - 而不是替代解决方案。
您的建议将不胜感激。
答案 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。