R语言如何对数据框第一列进行条件性partial gsub处理?
解决数据框列的条件partial gsub问题
我来帮你搞定这个条件替换的需求,这里有两种实用的方法可以实现你想要的效果:
方法1:用ifelse做分支判断
这种方法逻辑清晰,容易理解,先判断每行是否符合保留完整内容的条件,再分别处理:
首先先构造你的示例数据框方便测试:
df <- data.frame( V1 = c( "rs1231243:G:T:0", "rs483294:C:T:5098723", "19:4783234:T:G", "rs19873423:A:C", "19:83947355:C:T", "kpg897324", "rs3287492:G:C" ), stringsAsFactors = FALSE )
然后执行条件替换:
# 检测是否以"19:"开头,是则保留原内容,否则去掉冒号及后面的部分 df$V1 <- ifelse(grepl("^19:", df$V1), df$V1, gsub("\\:.*", "", df$V1))
解释一下:
grepl("^19:", df$V1):用正则^19:匹配以19:开头的字符串,返回布尔值向量- 符合条件的行直接保留原内容,不符合的行执行你原本的
gsub操作,删除冒号及之后的所有字符
方法2:用正则表达式一步完成(更简洁)
如果你喜欢用一行正则搞定,可以借助Perl风格的正向否定预查,省去分支判断:
df$V1 <- gsub("^(?!19:).*?\\K:.*", "", df$V1, perl = TRUE)
正则拆解:
^(?!19:):正向否定预查,确保字符串开头不是19:.*?:非贪婪匹配到第一个冒号前的所有内容\\K:忽略前面匹配到的内容,只对后面的:.*(冒号及之后的所有字符)执行替换(换成空字符串)- 必须加上
perl = TRUE才能启用这种Perl风格的正则语法
验证结果
执行完任意一种方法后,查看处理后的df$V1:
print(df$V1) # 输出结果: # [1] "rs1231243" "rs483294" "19:4783234:T:G" "rs19873423" "19:83947355:C:T" "kpg897324" "rs3287492"
完全符合你想要的输出效果。
内容的提问来源于stack exchange,提问作者Peter Chung
相关产品推荐
相关产品推荐

