首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将for -循环替换为基于条件if-语句的赋值

将for -循环替换为基于条件if-语句的赋值
EN

Stack Overflow用户
提问于 2022-02-21 13:23:48
回答 1查看 30关注 0票数 0

我一直试图编写一个函数,它将使用for-循环和if-语句逐行检查一个巨大的数据帧,然后将该行附加到一个新的数据框架中。这是我一直使用的代码的一般结构:

代码语言:javascript
复制
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-循环并更有效地完成分配?我很感谢你对此提出任何建议。

EN

回答 1

Stack Overflow用户

发布于 2022-02-21 14:15:07

下面是上面for循环的矢量化版本。不需要循环,也不需要rbind

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71207086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档