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

时间:2018-05-09 22:16:39

标签: r gsub grepl

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

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

1 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

<强>详情

  • ^ - 字符串开头
  • (?!.*test) - 一个负向预测(通过perl=TRUE在PCRE模式中支持)如果在除了换行符之外的任何0 +字符之后有一个test子字符串
  • ([^+]*) - 捕获第1组:除+以外的0个或更多字符
  • \\+ - +标志
  • .* - 到最后的剩余部分。

replacment参数中的\1恢复结果字符串中的Group 1值。

一个R测试片段:

> 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"