r语言 - 删除字符串末尾的下划线和数字



我正在使用一个具有一些下划线的列的数据集。有一个模式,但它们是不同的模式,如下图

ID     Col1
1029   ap_analog
2334   critical_1_mm_1
2334   transpose_2_mm_2
9877   public_1_yes_0_no_1
9877   public_1_yes_0_no_2
1333   Lateral_mm
1333   Lateral_mm_1
1333   Lateral_mm_2
1333   Lateral_mm_3
1333   ap_mm_axial
1333   ap_mm_axial_1
1333   ap_mm_axial_2
1333   ap_mm_axial_3
9876   central_star_six_mm
9876   central_star_six_mm_1
9876   central_star_six_mm_2
9876   central_star_six_mm_3

我只是想用这样的最终数据集将数字从字符串中分离出来

ID     Col1                     Index
1029   ap_analog                0
2334   critical_1_mm            1
2334   transpose_2_mm           2
9877   public_1_yes_0_no        1
9877   public_1_yes_0_no        2
1333   Lateral_mm               0
1333   Lateral_mm               1
1333   Lateral_mm               2  
1333   Lateral_mm               3
1333   ap_mm_axial              0
1333   ap_mm_axial              1
1333   ap_mm_axial              2
1333   ap_mm_axial              3
9876   central_star_six_mm      0
9876   central_star_six_mm      1
9876   central_star_six_mm      2
9876   central_star_six_mm      3

现在我做这件事效率很低。像这样

df1$index <- df1$Col1
for(i in 1:3) {
df1$index <-  regmatches(df1$index,gregexpr("(?<=_).*",df1$index,perl=TRUE))
}
df1$index[ which(df1$index == "character(0)")] <- 0

我将非常感谢任何改进这一点的建议。

使用dplyrstringr的一种方法:

我们可以提取Index值,即Col1末尾的数字,将NA值替换为0。我们可以去掉Col1的最后一位。

library(dplyr)
library(stringr)
library(dplyr)
df %>%
mutate(Index = str_extract(Col1, '\d+$'), 
Index = replace(Index, is.na(Index), 0), 
Col1 = sub('_\d+$', '', Col1))
#    ID                Col1 Index
#1  1029           ap_analog     0
#2  2334       critical_1_mm     1
#3  2334      transpose_2_mm     2
#4  9877   public_1_yes_0_no     1
#5  9877   public_1_yes_0_no     2
#6  1333          Lateral_mm     0
#7  1333          Lateral_mm     1
#8  1333          Lateral_mm     2
#9  1333          Lateral_mm     3
#10 1333         ap_mm_axial     0
#11 1333         ap_mm_axial     1
#12 1333         ap_mm_axial     2
#13 1333         ap_mm_axial     3
#14 9876 central_star_six_mm     0
#15 9876 central_star_six_mm     1
#16 9876 central_star_six_mm     2
#17 9876 central_star_six_mm     3

最新更新