for循环覆盖输出

时间:2014-03-29 19:14:11

标签: r list for-loop substring

我有以下代码,但我无法生成我想要的输出。输入位于如下所示的列表中:

>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循环覆盖输出?

1 个答案:

答案 0 :(得分:1)

for (i in length(spl))for (i in 2)相同,因此您的外循环只执行一次。

你的内部循环每次执行两次(3:2),但每次都覆盖endseqfrontseq,所以你只能在join.out上获得一个元素。


更新:这是我与lapplydo.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))