嵌套for循环替换为替换值

时间:2016-03-27 00:54:01

标签: r for-loop indexing nested

我正在尝试从大型研究中清理数据框。在名为“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次编辑时?谢谢你教我。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

我认为你可以在这里使用match来匹配badids与相应的正确日期。要仅匹配这些badids,您可以使用%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 )