我一直试图编写一个函数,它将使用for-循环和if-语句逐行检查一个巨大的数据帧,然后将该行附加到一个新的数据框架中。这是我一直使用的代码的一般结构:
vgm.bulk <- data.frame()
for(i in 1:nrow(data.df)) {
if(data.df$bestCHit[i] == "IGH" | data.df$bestCHit)[i] == "") {
local.df <- data.frame(
VDJ_vgene = data.df$vgene[i],
VJ_vgene = NA)
vgm.bulk <- rbind(vgm.bulk, local.df)
} else if (data.df$bestCHit[i] == "IGL" | data.df$bestCHit[i] == "IGK" {
local.df <- data.frame(
VDJ_vgene = NA,
VJ_vgene = data.df$vgene[i])
vgm.bulk <- rbind(vgm.bulk, local.df)
}实际上,我必须使用30列以上的条件赋值。当代码工作时,我发现我的运行时使用这种按顺序检查每一行的方法太慢,无法使用(对于一个有25000行的数据集,大约需要20分钟)。
因此,是否有一种方法可以放弃使用for-循环并更有效地完成分配?我很感谢你对此提出任何建议。
发布于 2022-02-21 14:15:07
下面是上面for循环的矢量化版本。不需要循环,也不需要rbind。
VDJ_gene <- rep(NA, nrow(data.df))
VJ_gene <- rep(NA, nrow(data.df))
i <- data.df$bestCHit %in% c("IGH", "")
VDJ_gene[i] <- data.df$bestCHit[i]
i <- data.df$bestCHit %in% c("IGL", "IGK")
VJ_gene[i] <- data.df$bestCHit[i]
vgm.bulk <- data.frame(VDJ_gene, VJ_gene)https://stackoverflow.com/questions/71207086
复制相似问题