我已经查看了之前提出的关于在列表中保留'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
}
}
}
此函数不会将任何元素附加到列表中,该列表仍为空?
答案 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
}
}