我试图使用dplyrdata.frame中删除列,其中列名包含除名称开头以外的任何子字符串(即除第一个索引外的任何索引).

环顾四周(双关语),这似乎通常是通过在dplyr::select()调用中传递给dplyr::matches()的正则表达式中包含lookbehind断言来实现的.我不熟悉这些是如何工作的,但我在下面try 实现这一点时出现了一个错误.

我是否错误地实现了lookbehind,或者这是我可以传递到matches()的正则表达式的限制?我欢迎一个有效的解决方案.

library(dplyr)

# Example data
df <- data.frame(bar = rnorm(1),
                 foo1 = rnorm(1),
                 bar_foo1 = rnorm(1),
                 bar_foo1_bat = rnorm(1))

# Desired output
df %>% select(bar, foo1)
#>        bar       foo1
#> 1 1.057651 -0.1526598

# Sucessfully drops columns with "foo1" anywhere
df %>% select(-matches(".*foo1.*"))
#>        bar
#> 1 1.057651

# Both fail to drop columns with "foo1" anywhere *except the start of the string*

df %>% select(-matches("(?<!^).*foo1.*"))
#> Warning in grep(needle, haystack, ...): TRE pattern compilation error 'Invalid
#> regexp'
#> Error in `select()`:
#> ! invalid regular expression '(?<!^).*foo1.*', reason 'Invalid regexp'

df %>% select(-matches("(?<!^)foo1.*"))
#> Warning in grep(needle, haystack, ...): TRE pattern compilation error 'Invalid
#> regexp'
#> Error in `select()`:
#> ! invalid regular expression '(?<!^)foo1.*', reason 'Invalid regexp'

reprex package(v2.0.1)于2022-07-14创建

推荐答案

在开始的时候你需要一个或多个.,这样你就可以写出^.{1,}.

df %>% dplyr::select(-matches("^.{1,}foo1"))
#         bar       foo1
# 1 -1.077056 -0.5649875

R相关问答推荐

有没有方法将琴弦完全捕捉到R中的多边形?

将Multilinetring合并到一个线串中,使用sf生成规则间隔的点

基于shiny 应用程序中的日期范围子集xts索引

从嵌套列表中智能提取线性模型系数

找出疾病消失的受试者

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

制作等距离的线串副本

在R中使用Scale_y_Break后更改y轴标签

合并后返回列表的数据帧列表

在另一个包中设置断点&S R函数

我如何go 掉盒子图底部的数字?

在R中使用列表(作为tibble列)进行向量化?

R中时间间隔的大向量与参考时间间隔的相交

循环遍历多个变量,并将每个变量插入函数R

创建在文本字符串中发现两个不同关键字的实例的数据框

将某个阈值以下的列中的值分类到不同的列中,否则保持该列的原样

如何创建一个由一个连续变量和一个因素变量组成的复杂方框图?

R:改进实现简单模型

如何将两个用不同的运算符替换*的矩阵相乘

如果y中存在x中的值,则将y行中的多个值复制到相应的x行中