繁体   English   中英

使用REGEX的grepl()的subset()来过滤R中的数据帧

[英]subset() with grepl() using REGEX for filtering a dataframe in R

我正在学习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]相匹配subset()的第三个参数。

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

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

您的建议将不胜感激。

存在各种各样的问题。

一个问题是模式中的多余空间。 删除它们或将自由间距修饰符(?x)perl = TRUE 无论哪种方式,您都必须摆脱字符类中的空格。 即使使用(?x)[ln]匹配“ m”,而[l - n]不匹配。 您可以在此处阅读有关自由间距修饰符及其对字符类内部和外部的影响的更多信息。

另一个问题是,在您的第一个grepl ,您正在一个长度为10的向量(字符向量?我们无法从示例中看出)内搜索。在6位的TRUE对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

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

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

'^c | [l - n]' '^c | [l - n]'搜索表达式在那些列中找不到任何内容。 另外,一种更直观的方法是使用[ , ]进行此类子设置。 参见http://adv-r.had.co.nz/Subsetting.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM