如果条件删除列名称中的字符串
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"
我有一个如下所示的数据框:
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"