我需要对编码变量 (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
这怎么办?
提前致谢!
您可以使用 {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
使用
strsplit()
:
library(dplyr)
df |>
mutate(last_number = sapply(strsplit(df$v1, "[A-Z]"), last))
使用 base R 和 gsub 的替代方案: 以下正则表达式查找以任何内容 (.*) 开头、后跟非数字字符 (\D+) 并以数字字符 (\d+) 结尾的模式 v1 值的所有出现情况。它将完整字符串替换为匹配的最终数字用作替换。然后使用 as.numeric() 将结果编码为数字(而不是数字字符)。
df$replicate<- as.numeric(gsub("^.*\\D+(\\d+)$","\\1",df$v1))