如何用gsub移除数据框列值中数字后的所有字符?
解决方法:用gsub移除数据框列中数字后的所有字符
没问题,这事儿用gsub搭配正则表达式就能轻松搞定!我帮你拆解一下思路和具体代码:
核心思路
我们的目标是保留每个值里「最后一个数字之前的所有内容」,删掉数字之后的所有字符。比如把T1a变成T1,T3b变成T3,已经是纯字母+数字的T2就保持不变。
具体代码实现
首先先构造你的示例数据框(如果已经有现成的,这步可以跳过):
# 构造示例数据 df <- data.frame( Tumoral_stage = c("T1a", "T1b", "T2c", "T3b", "T1c", "T2", "T3a"), Methastatic_stage = c("M0", "M0", "M0", "M0", "M0", "M0", "M1"), stringsAsFactors = FALSE )
然后用两种不同的正则写法来实现需求,选你觉得顺手的就行:
方法1:通用型正则(适配更多场景)
这个写法不管值的前缀是什么(比如多字母、混合字符),只要最后有数字,就保留到最后一个数字为止:
df$Tumoral_stage <- gsub("^(.*\\d).*", "\\1", df$Tumoral_stage)
- 正则解释:
^:匹配字符串开头(.*\\d):捕获分组,匹配「从开头到最后一个数字」的所有内容.*:匹配最后一个数字之后的所有字符\\1:用捕获到的分组内容替换整个字符串,相当于删掉数字后的部分
方法2:正向断言(更直观)
如果你习惯用perl风格的正则,这个写法更直观,直接匹配「数字之后的所有内容」并替换为空:
df$Tumoral_stage <- gsub("(?<=\\d).*", "", df$Tumoral_stage, perl = TRUE)
- 正则解释:
(?<=\\d):正向零宽断言,定位到「前面是数字」的位置.*:匹配该位置之后的所有字符- 替换为空字符串,就直接删掉了数字后的部分
运行结果
执行完代码后,你的数据框就变成了期望的样子:
Tumoral_stage Methastatic_stage 1 T1 M0 2 T1 M0 3 T2 M0 4 T3 M0 5 T1 M0 6 T2 M0 7 T3 M1
内容的提问来源于stack exchange,提问作者Jeni
相关产品推荐
相关产品推荐

