从多个字母和数字字符串中减去1个字母和数字

时间:2018-02-28 11:34:21

标签: r vector gsub

我有一个字符串向量:

grid_loc <- c("B2", "B3", "B4", "C2", "C3", "C4", "D2", "D3", "D4")

如何重新编码这些字符串,以便新的矢量看起来像这样?:

c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")

正如你所看到的,我希望每个字母和数字字符串都有一个&#34;一个&#34;减去它。 B变为A3变为2等。

在原始数据集中,没有包含字母A或数字1的字符串,因此弄清楚如何处理这种情况并不是问题。

我尝试使用gsub()手动重新编码每个字符串,但由于真实数据集的大小,这太费力了。

3 个答案:

答案 0 :(得分:4)

另一种方法,使用base R可以split在带strsplit的字母后面的每个元素,计算每个部分的“减1”操作并重新制作它们:

sapply(strsplit(c(grid_loc, "B20"), "(?<=[B-Z])", perl=TRUE), 
       function(x) paste0(LETTERS[match(x[1], LETTERS)-1], as.numeric(x[2])-1))
#  [1] "A1"  "A2"  "A3"  "B1"  "B2"  "B3"  "C1"  "C2"  "C3"  "A19"

答案 1 :(得分:3)

如果原始向量中没有“A”或“1”,则一个选项是使用gsubfn减去该数字并将该字母替换为之前的字母它

library(gsubfn)
f1 <- function(x, y) paste0(LETTERS[match(x, LETTERS)-1], as.numeric(y) - 1)
gsubfn('([A-Z])([0-9]+)', f1, grid_loc)
#[1] "A1"  "A2"  "A3"  "B1"  "B2"  "B3"  "C1"  "C2"  "C3"  "A19"

数据

grid_loc <- c("B2", "B3", "B4", "C2", "C3", "C4", "D2", "D3", "D4", "B20")

答案 2 :(得分:0)

HERE纯粹是基础R方式:

fun=function(x){paste0(LETTERS[match(sub("[^A-Z]+","",x),LETTERS)-1],
              as.numeric(sub("\\D+","",x))-1)}
fun(x)
 [1] "A1"  "A2"  "A3"  "B1"  "B2"  "B3"  "C1"  "C2"  "C3"  "A19"

数据

x=c("B2", "B3", "B4", "C2", "C3", "C4", "D2", "D3", "D4", "B20")