Regex 用相应的一组字母替换字母
我遇到了一个小问题,没有找到合适的搜索词。 我有“A”-“N”的字母,我想根据它们在字母表中的位置,用“A”-“G”替换这些大于“G”的字母。使用Regex 用相应的一组字母替换字母,regex,r,Regex,R,我遇到了一个小问题,没有找到合适的搜索词。 我有“A”-“N”的字母,我想根据它们在字母表中的位置,用“A”-“G”替换这些大于“G”的字母。使用gsub来解决这个问题似乎很麻烦。或者有任何正则表达式可以做得更聪明 k <- rep(LETTERS[1:14],2) gsub(pattern="H", replace="A", x=k) gsub(pattern="I", replace="B", x=k) gsub(pattern="J", replace="C", x=k) gsub(
gsub
来解决这个问题似乎很麻烦。或者有任何正则表达式可以做得更聪明
k <- rep(LETTERS[1:14],2)
gsub(pattern="H", replace="A", x=k)
gsub(pattern="I", replace="B", x=k)
gsub(pattern="J", replace="C", x=k)
gsub(pattern="K", replace="D", x=k)
# etc.
k我相信有一种方法可以使它更紧凑,但这可能是您在第二个非正则表达式想法中考虑的事情:
k <- factor(k)
> k1 <- as.integer(k) %% 7
> k1[k1 == 0] <- 7
> LETTERS[k1]
[1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" "A"
[23] "B" "C" "D" "E" "F" "G"
每当我看到这样的问题时,我的第一个想法是match
:
AG <- LETTERS[1:7]
HN <- LETTERS[8:14]
k <- rep(LETTERS[1:14],2)
n <- AG[match(k, HN)]
ifelse(is.na(n), k, n)
# [1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E"
#[20] "F" "G" "A" "B" "C" "D" "E" "F" "G"
以下是一个简洁明了的解决方案:
k <- rep(LETTERS[1:14],2)
# (1) Create a lookup vector whose elements can be indexed into
# by their names and will return their associated values
subs <- setNames(rep(LETTERS[1:7], 2), LETTERS[1:14])
subs
# A B C D E F G H I J K L M N
# "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
# (2) Use it.
unname(subs[k])
# [1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
# [15] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
k如果您的问题只是A-N:
set.seed(1)
k = sample(LETTERS[1:14], 42, replace=TRUE)
temp = match(k, LETTERS)
# > table(k)
# k
# A B C D E F G I J K L M N
# 2 2 5 2 1 6 3 3 5 4 3 3 3
k[which(temp > 7)] = LETTERS[temp[temp > 7] -7]
# > table(k)
# k
# A B C D E F G
# 2 5 10 6 4 9 6
这将H-N转换为A-G:
chartr("HIJKLMN", "ABCDEFG", k)
在这里,你可以借点聪明,以后再还;)<代码>k1@JoshO'Brien,我喜欢这种聪明。这使得它可以在一行中解决:k1=字母[((匹配(k,字母)-1)%%7)+1]
。正如您可能已经从建议的答案中了解到的,match
是您正在寻找的As.numeric
匹配(c(“A”,“S”,“k”),字母)
将返回{1,19,11}。是的,谢谢。我需要记住。这么多新事物,我几乎总是忘记以前遇到的一些事情。虽然这场比赛对我来说很新鲜,很好。我想说,在这种情况下很难克服这一点。再一次,我把阅读base
中的函数列表放在我的待办事项列表中。谢谢你指出这一点。嗯,我在寻找合适的替换函数时遇到了这个函数。但是我没有尝试,因为我假设旧参数和新参数只适用于一个字符串,而不适用于向量。我应该试试看。顺便说一句,有人知道查特代表什么吗?它更容易记住。
k <- rep(LETTERS[1:14],2)
# (1) Create a lookup vector whose elements can be indexed into
# by their names and will return their associated values
subs <- setNames(rep(LETTERS[1:7], 2), LETTERS[1:14])
subs
# A B C D E F G H I J K L M N
# "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
# (2) Use it.
unname(subs[k])
# [1] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
# [15] "A" "B" "C" "D" "E" "F" "G" "A" "B" "C" "D" "E" "F" "G"
set.seed(1)
k = sample(LETTERS[1:14], 42, replace=TRUE)
temp = match(k, LETTERS)
# > table(k)
# k
# A B C D E F G I J K L M N
# 2 2 5 2 1 6 3 3 5 4 3 3 3
k[which(temp > 7)] = LETTERS[temp[temp > 7] -7]
# > table(k)
# k
# A B C D E F G
# 2 5 10 6 4 9 6
chartr("HIJKLMN", "ABCDEFG", k)