Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用正则表达式筛选R中的数据帧_R_Regex_Subset_Grepl - Fatal编程技术网

使用正则表达式筛选R中的数据帧

使用正则表达式筛选R中的数据帧,r,regex,subset,grepl,R,Regex,Subset,Grepl,我正在学习R,并使用subset和grepl与Regex进行实验,以过滤数据帧。我已经创建了一个非常小的数据帧来使用: 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)) ) 在我看来,第二

我正在学习R,并使用subset和grepl与Regex进行实验,以过滤数据帧。我已经创建了一个非常小的数据帧来使用:

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”包含[l-n]正则表达式模式中指定的字母l、m、n,列z和w,因为这些名称与子集第三个参数中的正则表达式[yz]匹配

我怀疑它是在寻找栏目名称的匹配,而不是栏目内容的匹配,这正是我感兴趣的地方

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


非常感谢您的建议。

在这些列中,“^c|[l-n]”搜索表达式找不到任何内容。此外,更直观的方法是使用[,]进行这种类型的子集设置。请参阅。

存在各种各样的问题

一个问题是模式中的额外空间。删除它们或使用自由间距修饰符?x和perl=TRUE。无论哪种方式,都必须去掉character类中的空格。[l-n]匹配m,而[l-n]不匹配,即使使用?x。您可以阅读更多有关“自由间距”修改器及其在角色类内外的影响的信息

另一个问题是,在你的第一个grepl中,你在一个向量中搜索?我们不能从长度10的例子中分辨出来。对于5行data.frame,第6位的TRUE表示什么?返回5行数据帧的第6行是没有意义的。相反,您可以查看是否为w列或| z列找到了模式。查看每个列,而不是列的串联

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

不需要^anchor,因为您的所有字符串都包含一个字符,但我将保留它:

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]与w | z:


你想要的输出是什么?另外,如果您的列包含单个字母,则不需要在正则表达式中使用==/%in%,否则匹配应该更有效。但是w不包含字母l、m、n吗?
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