在R中使用str_sub提取编码变量的最后一位或两位数字

问题描述 投票:0回答:3

我需要对编码变量 (v1) 的最后一位或两位数字(重复)进行子集化,即从 1 到 12。 使用 str_sub 函数,当有两位数时,我无法获取整数。 如果我选择最后两位数字,则该函数会以一位重复的方式获取前面的字母:

v1<-c("D018BG1","D018BG2","D018BG3","D018BG4","D018BG5","D018BG6","D018BG7","D018BG8","D018BG9",
                             "D018BG10","D018BG11","D018BG12")
df<-data.frame(v1)
df
v1
1   D018BG1
2   D018BG2
3   D018BG3
4   D018BG4
5   D018BG5
6   D018BG6
7   D018BG7
8   D018BG8
9   D018BG9
10 D018BG10
11 D018BG11
12 D018BG12

df%>%
     mutate(replicate=str_sub(v1,-1,-1))
v1 replicate
1   D018BG1         1
2   D018BG2         2
3   D018BG3         3
4   D018BG4         4
5   D018BG5         5
6   D018BG6         6
7   D018BG7         7
8   D018BG8         8
9   D018BG9         9
10 D018BG10         0
11 D018BG11         1
12 D018BG12         2


df%>%
     mutate(replicate=str_sub(v1,-2,-1))
v1 replicate
1   D018BG1        G1
2   D018BG2        G2
3   D018BG3        G3
4   D018BG4        G4
5   D018BG5        G5
6   D018BG6        G6
7   D018BG7        G7
8   D018BG8        G8
9   D018BG9        G9
10 D018BG10        10
11 D018BG11        11
12 D018BG12        12
 

这怎么办?

提前致谢!

r regex subset digits mutate
3个回答
2
投票

您可以使用 {stringr} 中的

str_extract
函数。

library(dplyr)
library(stringr)

df %>%
  mutate(replicate_one_digit = as.numeric(str_extract(v1, "\\d$")),
         replicate_two_digits = as.numeric(str_extract(v1, "\\d{1,2}$")))

         v1 replicate_one_digit replicate_two_digits
1   D018BG1                   1                    1
2   D018BG2                   2                    2
3   D018BG3                   3                    3
4   D018BG4                   4                    4
5   D018BG5                   5                    5
6   D018BG6                   6                    6
7   D018BG7                   7                    7
8   D018BG8                   8                    8
9   D018BG9                   9                    9
10 D018BG10                   0                   10
11 D018BG11                   1                   11
12 D018BG12                   2                   12

1
投票

使用

strsplit()

library(dplyr)

df |> 
  mutate(last_number = sapply(strsplit(df$v1, "[A-Z]"), last))

1
投票

使用 base R 和 gsub 的替代方案: 以下正则表达式查找以任何内容 (.*) 开头、后跟非数字字符 (\D+) 并以数字字符 (\d+) 结尾的模式 v1 值的所有出现情况。它将完整字符串替换为匹配的最终数字用作替换。然后使用 as.numeric() 将结果编码为数字(而不是数字字符)。

df$replicate<- as.numeric(gsub("^.*\\D+(\\d+)$","\\1",df$v1))
© www.soinside.com 2019 - 2024. All rights reserved.