将for循环的输出添加到列表中

时间:2017-10-12 10:30:18

标签: r bioinformatics

我已经查看了之前提出的关于在列表中保留'for loop'输出的问题,但我似乎无法将其应用于我的函数。

也许有人可以解释我做错了什么。

dna_seqs <- list('id1', 'ATGGCAATAACCCCCCGTTTCTACTTCTAGAGGAGAAAAGT', 'id2', 'TCCGTTAAGATATTCTTACGTGTGACGTAGCTATGTATTTTGCAGAGCTGGCGAACGCGTTGAACACTTCACAGATGGT', 'id3', 'AGCTGGTTCCTGCGTGAGCTCGAGACTCGGGATGACAGCTCTTTAAACATAGAGCGGGGGCGTCGAACGGTCGA', 'id4', 'CATCACCGCGATAGGCTGACAAAGGTTTAACATTGAATAGCAAGGCACTTCCGGTCTCAATGAACGGCCGGGAA')

gc_list <- list() 
count_gc <- function(x) {
  for (i in x) {
    if (startsWith(i, 'id')) {
      gc_list[[i]] <- i

    } 
    else {
      seq <- str_to_upper(i)
      seq <- gsub('N', '', seq)
      gc <- str_count(seq, 'G') + str_count(seq, 'C')
      gc_content <- gc / nchar(seq) * 100
      gc_list[[i]] <- gc_content
    }
  } 
}

此函数不会将任何元素附加到列表中,该列表仍为空?

2 个答案:

答案 0 :(得分:4)

使用lapply()并省去烦恼

gc_list <- lapply(dna_seqs, function(seq) {
    if (startsWith(seq, "id")) {
        seq
    } else {
        seq <- str_to_upper(seq)
        seq <- gsub('N', '', seq)
        gc <- str_count(seq, 'G') + str_count(seq, 'C')
        gc / nchar(seq) * 100
    }
})

但更好的是,使用“整洁”的#39;数据结构

df = data.frame(
    id = unlist(dna_seqs[c(TRUE, FALSE)]),
    seq = unlist(dna_seqs[c(FALSE, TRUE)]),
    stringsAsFactors = FALSE
)

和更简单(无if ()条件)和向量化(x可以是任何长度)函数

gc_content = function(x) {
    x = gsub("N", "", str_to_upper(x))
    str_count(x, "[GC]") / nchar(x) * 100
}

改变整洁的数据

df$gc = gc_content(df$seq)

答案 1 :(得分:1)

请使用以下代码

for(i in 1:length(dna_seqs)){

  if (startsWith(dna_seqs[[i]], 'id')) {
    gc_list[[i]] <- dna_seqs[[i]]

  } 
  else {
    seq <- str_to_upper(dna_seqs[[i]])
    seq <- gsub('N', '', seq)
    gc <- str_count(seq, 'G') + str_count(seq, 'C')
    gc_content <- gc / nchar(seq) * 100
    gc_list[[i]] <- gc_content
  }
}