R语言中给基因分块列表添加geneId报错及替代方法问询
问题解决:拆分基因列表的报错修复与替代方案
1. 修复"arguments must have same length"报错
报错根源是tapply的参数要求:第二个参数必须是和第一个参数长度完全一致的分组向量,但你传入的list.of.chunks是一个包含30个元素的索引列表,和gene.bed$geneId的57539个元素长度不匹配,导致报错。
两种修复方式:
方式1:用索引列表直接提取基因ID
list.of.chunks本身就是各分块的位置索引,直接用它提取gene.data$geneId即可:
# 注意统一变量名:如果你的基因ID存在gene.bed里就替换成gene.bed$geneId gene.chunks <- lapply(list.of.chunks, function(idx) gene.data$geneId[idx])
方式2:用分组向量适配tapply逻辑
如果你坚持要用tapply,把生成分组的向量直接传入,而非索引列表:
ncores=30 L <- length(gene.data$geneId) group_vec <- sort(rep_len(seq_len(ncores), L)) gene.chunks <- tapply(gene.data$geneId, group_vec, FUN = identity)
FUN=identity表示直接返回每个分组的元素,符合你的拆分需求。
2. 可用的替代函数
split函数(最简洁直接)
不需要先生成索引列表,直接用分组向量拆分基因ID向量,一步到位:
ncores=30 L <- length(gene.data$geneId) group_vec <- sort(rep_len(seq_len(ncores), L)) gene.chunks <- split(gene.data$geneId, group_vec)
purrr::map(tidyverse风格)
如果你习惯使用tidyverse工具,结合索引列表用map提取更优雅:
library(purrr) gene.chunks <- map(list.of.chunks, ~ gene.data$geneId[.x])
dplyr::group_split(适合数据框整行拆分)
如果gene.data是数据框,需要保留基因的完整行数据而非仅geneId,用这个更合适:
library(dplyr) gene.chunks <- gene.data %>% mutate(group = sort(rep_len(seq_len(ncores), nrow(.)))) %>% group_split(group, .keep = FALSE)
返回的每个分块是包含对应组所有基因数据的数据框。
内容的提问来源于stack exchange,提问作者Kosar Hooshmand
相关产品推荐
相关产品推荐

