如果条件删除列名称中的字符串

Remove String in Column Name if condition

我有一个如下所示的数据框:

df

Col+djek    Col_test+deg    Col_+dege     Col_+test
       1               1            1             1

在列名中,如果列名不包含字符串 'test',如何删除“+”符号后的任何内容?

这是我的尝试,但它给了我一个错误:

colnames(df) = if(!grepl(df, "test")){ gsub("+.*","",colnames(df))}

最终输出应该是这样的:

     Col    Col_test+deg         Col_     Col_+test
       1               1            1             1

您可以使用

gsub("^(?!.*test)([^+]*)\+.*","\1", colnames(df), perl=TRUE)

参见regex demo

详情

  • ^ - 字符串开头
  • (?!.*test) - 如果在除换行字符之外的任何 0+ 个字符之后有一个 test 子字符串,则否定先行(通过 perl=TRUE 在 PCRE 模式中支持)匹配失败
  • ([^+]*) - 捕获第 1 组:+
  • 以外的 0 个或更多字符
  • \+ - + 符号
  • .* - 该行的剩余部分到最后。

替换参数中的 </code> 恢复结果字符串中的第 1 组值。</p> <p>一个 R 测试片段:</p> <pre><code>> names <- c("Col+djek", "Col_test+deg", "Col_+dege", "Col_+test") > gsub("^(?!.*test)([^+]*)\+.*","\1", names, perl=TRUE) [1] "Col" "Col_test+deg" "Col_" "Col_+test"