我有一个如下所示的数据框:
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
答案 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"