2017-10-13 132 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,我已經測試過它,它完美的工作。謝謝大的時間解決方案... –

相關問題