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

Add output of for loop to list

我查看了之前提出的有关将 '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
    }
  } 
}

此函数未向列表追加任何元素,该列表仍为空?

请使用以下代码

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
  }
}

使用 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
    }
})

但更好的是,使用 'tidy' 数据结构

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)