R语言求助:如何筛选列表中各数据框的独有基因名?
筛选列表中各数据框的独有基因名
你的代码失效的核心原因是:read.table读取的结果是数据框,而setdiff在对比数据框和向量时,类型不匹配导致逻辑出错。解决思路是先把每个数据框转换成字符向量,再执行集合差运算。
修正方案1:读取时直接转为向量
读取文件时就把单列数据框提取为字符向量,避免后续类型转换:
temp = list.files(pattern = "*.txt") # 读取后直接取第一列转为字符向量 myfiles = lapply(temp, function(x) { read.table(x, header = FALSE, stringsAsFactors = FALSE)[[1]] }) # 计算每个文件的独有基因 unique.genes = lapply(seq_along(myfiles), function(n) { setdiff(myfiles[[n]], unlist(myfiles[-n])) })
修正方案2:对已读取的数据框做转换
如果已经完成文件读取,可先将列表中的数据框批量转为向量:
# 将每个数据框转为字符向量 myfiles_vec = lapply(myfiles, function(df) as.character(df[[1]])) # 计算独有基因 unique.genes = lapply(seq_along(myfiles_vec), function(n) { setdiff(myfiles_vec[[n]], unlist(myfiles_vec[-n])) })
高效备选方案(多文件场景)
当文件数量较多时,先统计所有基因的跨文件出现次数,再筛选独有基因,效率更高:
# 转换为向量列表(如果还没转的话) myfiles_vec = lapply(myfiles, function(df) as.character(df[[1]])) # 合并所有基因并标记来源文件 all_genes = do.call(rbind, lapply(seq_along(myfiles_vec), function(n) { data.frame(gene = myfiles_vec[[n]], file_id = n, stringsAsFactors = FALSE) })) # 统计每个基因出现在多少个文件中 gene_file_count = table(all_genes$gene) # 筛选仅在单个文件出现的基因 single_file_genes = names(gene_file_count[gene_file_count == 1]) # 为每个文件提取对应的独有基因 unique.genes = lapply(myfiles_vec, function(gene_list) { gene_list[gene_list %in% single_file_genes] })
测试你的示例数据,方案1/2会返回:
- 第一个文件的独有基因:
SCA-6_Chr1v1_00004、SCA-6_Chr1v1_00005、SCA-6_Chr1v1_00010、SCA-6_Chr1v1_00015、SCA-6_Chr1v1_00017 - 第二个文件的独有基因:
SCA-6_Chr1v1_00007、SCA-6_Chr1v1_20005、SCA-6_Chr1v1_00200、SCA-6_Chr1v1_10075、SCA-6_Chr1v1_00100
内容的提问来源于stack exchange,提问作者Patrick Thomas
相关产品推荐
相关产品推荐

