2017-10-13 131 views
0

我试图从myDF2中替换myDF1中的值,其中行匹配列“studyno”但我迄今发现的解决方案don似乎没有给我想要的输出。R - 使用来自另一个数据帧的值,根据行匹配填充一个数据帧

下面是data.frames:

myDF1 <- structure(list(studyno = c("J1000/9", "J1000/9", "J1000/9", "J1000/9", 
"J1000/9", "J1000/9"), date = structure(c(17123, 17127, 17135, 
17144, 17148, 17155), class = "Date"), pf_mcl = c(NA_integer_, 
NA_integer_, NA_integer_, NA_integer_, NA_integer_, NA_integer_ 
), year = c(2016, 2016, 2016, 2016, 2016, 2016)), .Names = c("studyno", 
"date", "pf_mcl", "year"), row.names = c(NA, 6L), class = "data.frame") 

myDF2 <- structure(list(studyno = c("J740/4", "J1000/9", "J895/7", "J931/6", 
"J609/1", "J941/3"), pf_mcl = c(0L, 0L, 0L, 0L, 0L, 0L)), .Names = c("studyno", 
"pf_mcl"), row.names = c(NA, 6L), class = "data.frame") 

一个解决办法我试过似乎工作如下所示,然而,我发现,无论值在myDF1之前已被删除。

myDF1$pf_mcl <- myDF2$pf_mcl[match(myDF1$studyno, myDF2$studyno)] 
+0

你能澄清你想要的输出,和你提出的解决方案有什么不同?在我看来,如果你想“从myDF2中替换myDF1中的值”,那么“* should *”之前myDF1中的“值”已被删除“,所以我认为我错过了一些东西。 – gung

+0

你应该看看'merge'函数。 –

+0

Hi @ gung,抱歉不清楚。 myDF2是myDF1的一个子集,但是myDF2比myDF1更好。出于这个原因,我发现myDF1中有一些行缺少值,因此我在myDF2中寻找匹配并更新myDF1中的值。但是,我不想放弃不匹配行中的值,这是我发布的脚本所做的。让我知道是否需要添加更多细节。 –

回答

1
# Merge myDF1 & myDF2 by the "studyno", keeping all the rows in myDF1 
agg_df = merge(myDF1, myDF2, "studyno", all.x=TRUE) 
# Populate pf_mcl in the merged dataframe by using pf_mcl in myDF2 if it is available. Otherwise, use pf_mcl from myDF1 
# is missing in myDF1 
agg_df$pf_mcl = ifelse(is.na(agg_df$pf_mcl.y), agg_df$pf_mcl.x, agg_df$pf_mcl.y) 
myDF1 = agg_df[, names(myDF1)] 
+0

Hi @ Kelli-Jean,感谢您的解答,请原谅我的解释......让我进一步阐述。正如我前面提到的,myDF2是myDF1的一个精心策划的子集。因此,两个数据集中的某些行基于“studyno”进行匹配,您可能会发现myDF1 $ pf_mcl中缺少值或值错误。我想要做的就是在myDF2中标识匹配的行,并使用myDF2 $ pf_mcl中的值填充myDF1 $ pf_mcl。如果一行不匹配,值应该保持不变。我不知道是否值得一提,这两个数据框还有其他列...我选择了几个例如 –

+0

@ K.Wamae我更新了我的答案。如果这仍然不是您期望的答案,您能否提供一个记录解决方案无效的数据集?和预期的产出。谢谢! –

+0

亲爱的@ Kelli-Jean,我已经测试过它,它完美的工作。谢谢大的时间解决方案... –

相关问题