【问题标题】:Nested for-loop to replace to replace values嵌套 for 循环替换以替换值
【发布时间】:2016-07-14 13:14:56
【问题描述】:

我正在尝试从一项大型研究中清理数据框。在名为“startdate”的列中输入了错误的开始日期,有 12 个研究对象。我创建了一个向量,其中包含需要编辑的 12 个主题的学习 ID,称为“badids”。

badids<-c(41, 4169, 12004, 7768, 180, 78, 4082, 430, 585, 1313, 449, 9074)

我还为这 12 个主题创建了一个包含 12 个正确日期的向量,称为“正确日期”。

我可以使用以下命令一一替换不正确的日期:

dat[dat$Study.ID.Number.==badids[1], "startdate"]<-correctdates[1]

但那是低效的。

嵌套的 for 循环似乎是一个更好的解决方案,所以我尝试了:

for(i in 1:12)
{
    for (j in 1:12) {                    
        dat[dat$Study.ID.Number.==badids[i], "startdate"]<-correctdates[j]
    }
}

我没有从这个循环中收到错误消息,但它也没有更正数据框中的开始日期。我错过了什么?有没有更好的方法来完全做到这一点,我应该考虑特别是在未来处理超过 12 次编辑时?谢谢你教我。

【问题讨论】:

    标签: r for-loop indexing nested


    【解决方案1】:

    如果我正确理解您的情况,那么您的代码中的问题是您执行的 for 循环太多。您的代码似乎将badid 的每个主题的startdate 替换了十二次。结果,它们最终都具有相同的值:startdate 中的最后一个值。删除内部循环应该可以解决问题:

    for(i in 1:12)
    {       
        dat$startdate[dat$Study.ID.Number.==badids[i]] <- correctdates[i]
    }
    

    【讨论】:

    • 完美!这正是我想要的。谢谢安德里亚。
    【解决方案2】:

    我认为您可以在此处使用match 将badid 与其对应的正确日期匹配。要仅匹配那些 badid,您可以使用%in%检查它们是否存在于 Study.ID 中。 ifelse 语句中的编号。

    这应该可行:

    ifelse(dat$Study.ID.Number. %in% badids,   
           correctdates[match(dat$Study.ID.Number. , badids)],
           dat$startdate )
    

    编辑:

    现在试试这个快速演示似乎对我有用:

    set.seed(1)
    badids = c(2,4)
    correctdates = c(100,200)
    dat <- data.frame(Study.ID.Number. = rep(c(1:5),5),
              startdate = sample(1:10,25,T))
    
    dat$startdate  <- ifelse(dat$Study.ID.Number. %in% badids,   
           correctdates[match(dat$Study.ID.Number. , badids)],
           dat$startdate )
    

    【讨论】:

    • 不幸的是,这似乎不起作用。 dat 中的日期保持不变。
    • @user2230555 很确定它可以工作 - 我刚刚测试过它,它可以节省时间而不是将其放入循环中
    • 演示效果很好。不知道为什么我的数据框没有看到相同的结果。
    猜你喜欢
    • 2019-06-06
    • 2020-06-03
    • 2010-10-03
    • 2018-05-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多