Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 用相应的一组字母替换字母_Regex_R - Fatal编程技术网

Regex 用相应的一组字母替换字母

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(

我遇到了一个小问题,没有找到合适的搜索词。 我有“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(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)