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