我必须编写一个函数,用固定数字将字符串的字符移动到另一个字符。 字母矢量是:
abc <- c(LETTERS+letters+" "+"."+","+"!"+"?")
当我有例如文本 ”。,!?”我移动字符的数字是3,“,”应该是“?”但在“?”的统计输出“A”。 我的代码:
text<- ".,!?"
move <- 3
abc <- c(LETTERS,letters, " ", ".",",","!","?")
original <- strsplit(paste(text, collapse=""), "",fixed = TRUE)[[1]]
crypt <- c()
i <- 1
for (i in 1:length(original)) {
temp.pos <- which(abc==original[i])
sub1 <- (temp.pos+move)/57 # The sub1 and 2 are for handle a number higher than the length of the vector abc
sub2 <- floor(sub1)-1
crypt.pos <- sub1*57-sub2*57
print(crypt.pos)
l <- crypt.pos
temp.letter <- abc[l]
crypt <- c(crypt, temp.letter)
}
我尝试过一些东西,但从未得到过“?”作为“。”的输出
谢谢。
答案 0 :(得分:0)
我不认为你需要一个for循环来实现你想要达到的目标。您还可以构造一个命名向量来进行字符匹配:
# the named vector
abc <- c(LETTERS,letters, " ", ".",",","!","?")
number <- 2
names(abc) = c(tail(abc,number),head(abc,length(abc)-number))
# test
str = c("ABCD,$")
paste(abc[strsplit(str,split="")[[1]]],collapse="")
输出:
[1] "CDEF?"
如果你想保留字符而不是你的shift-vector中的字符:
str = c("ABCD,$")
splitted = strsplit(str,split="")[[1]]
new_str = abc[splitted]
new_str[is.na(new_str)] = splitted[is.na(new_str)]
paste(new_str,collapse="")
输出:
[1] "CDEF?$"
希望这有帮助!