我有以下代码,但我无法生成我想要的输出。输入位于如下所示的列表中:
>spl
$A
V1 V2
1 A LLLLLLLLLLLLLLLLLLLLzzzzzzzzzzzzzzzzzzzzz
2 A DDDDDDDDDDDDDDDDDDvvvvvvvvvvvvvvvvvvvvvvv
3 A AAAAAAAAAAAAAAAAAAAAxxxxxxxxxxxxxxxxxxxxx
$B
V1 V2
4 B ZZZZZZZZZZZZZZZZZZZaaaaaaaaaaaaaaaaaaa
5 B MMMMMMMMMMMMMMMMMMMMzzzzzzzzzzzzzzzzz
6 B HHHHHHHHHHHHHHHHHHHHHkkkkkkkkkkkkkkkkk
s1 <- read.table('~/Downloads/tst.txt', header=F)
spl <- split(s1, f=s1$V1)
for (i in length(spl)){
seqs <- spl[[i]]$V2
for (last in seq(length(spl[[i]]$V2), to=2)){
frontseq <- substring(seqs[last], max(nchar(as.character(seqs[last]))-16),max(nchar(as.character(seqs[last]))))
}
for (first in seq(length(spl[[i]]$V2), to=2)){
endseq <- substring(seqs[first], 1, 16)
}
join.out <- rbind(join.out, paste(frontseq, endseq, sep=''))
}
我想要的输出将一行的末尾加到另一行的开头:
基本上,spl [1]中最后一行的最后一个子串(长度为16)应该与第一行和的第一个子串连接。 spl [1]中第二行的子串。然后,spl [1]中第二行的最后一个子字符串应该与同一行的起始子字符串连接。那么spl [2]应该会发生同样的事情。第1行应始终被忽略。
因此输出应该如下所示:
A xxxxxxxxxxxxxxxxAAAAAAAAAAAAAAAA
A xxxxxxxxxxxxxxxxDDDDDDDDDDDDDDDD
A vvvvvvvvvvvvvvvvDDDDDDDDDDDDDDDD
B kkkkkkkkkkkkkkkkHHHHHHHHHHHHHHHH
B kkkkkkkkkkkkkkkkMMMMMMMMMMMMMMMM
B zzzzzzzzzzzzzzzzzMMMMMMMMMMMMMMM
相反,似乎我覆盖了输出,我正在生成看起来像这样的东西。
[,1]
[1,] "zzzzzzzzzzzzzzzzzMMMMMMMMMMMMMMMM""
如何防止for循环覆盖输出?
答案 0 :(得分:1)
for (i in length(spl))
与for (i in 2)
相同,因此您的外循环只执行一次。
你的内部循环每次执行两次(3:2
),但每次都覆盖endseq
和frontseq
,所以你只能在join.out
上获得一个元素。
更新:这是我与lapply
和do.call
重新组合的rbind
解决方案。我认为这符合你的逻辑。
s1 <- read.table(textConnection("A LLLLLLLLLLLLLLLLLLLLzzzzzzzzzzzzzzzzzzzzz
A DDDDDDDDDDDDDDDDDDvvvvvvvvvvvvvvvvvvvvvvv
A AAAAAAAAAAAAAAAAAAAAxxxxxxxxxxxxxxxxxxxxx
B ZZZZZZZZZZZZZZZZZZZaaaaaaaaaaaaaaaaaaa
B MMMMMMMMMMMMMMMMMMMMzzzzzzzzzzzzzzzzz
B HHHHHHHHHHHHHHHHHHHHHkkkkkkkkkkkkkkkkk"), stringsAsFactors=FALSE)
spl <- split(s1, f=s1$V1)
myFun <- function(x) {
x <- x[nrow(x):2, ]
front <- substring(x$V2, nchar(x$V2) - 16, nchar(x$V2))
front <- c(front[1], front)
back <- substring(x$V2, 1, 16)
back <- c(back, back[length(back)])
data.frame(paste0(front, back))
}
do.call(rbind, lapply(spl, myFun))