从多串字母和数字中减去1个字母和数字
Subtract 1 letter and number from multiple strings of letters and numbers
我有一个字符串向量:
grid_loc <- c("B2", "B3", "B4", "C2", "C3", "C4", "D2", "D3", "D4")
如何重新编码这些字符串以使新向量看起来像这样?:
c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
如您所见,我希望每个字母和数字字符串都减去 "one"。 B
变为 A
,3
变为 2
等
在原始数据集中没有包含字母 A
或数字 1
的字符串,因此弄清楚如何处理这种情况不是问题。
我尝试使用 gsub()
手动重新编码每个字符串,但由于真实数据集的大小,这太费力了。
如果原始向量中没有“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")
另一种方式,使用base R
可以是split
字母后的每个元素strsplit
,计算每个部分的"minus 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"
这里是纯粹的基础 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")
我有一个字符串向量:
grid_loc <- c("B2", "B3", "B4", "C2", "C3", "C4", "D2", "D3", "D4")
如何重新编码这些字符串以使新向量看起来像这样?:
c("A1", "A2", "A3", "B1", "B2", "B3", "C1", "C2", "C3")
如您所见,我希望每个字母和数字字符串都减去 "one"。 B
变为 A
,3
变为 2
等
在原始数据集中没有包含字母 A
或数字 1
的字符串,因此弄清楚如何处理这种情况不是问题。
我尝试使用 gsub()
手动重新编码每个字符串,但由于真实数据集的大小,这太费力了。
如果原始向量中没有“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")
另一种方式,使用base R
可以是split
字母后的每个元素strsplit
,计算每个部分的"minus 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"
这里是纯粹的基础 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")