2017-11-25 33 views
0

水平替換因子水平我有一個數據幀df1與被叫lepspID因子和與被叫lepsp_updatesmatchID因子的第二數據幀df2。我需要更新df1中的所有lepsp信息與lepsp_updates中的df2與另一個因素

這將需要覆蓋/替換一些當前的lepsp或填寫該欄的空白條目。但是,目前lepsp_updatesNA許多條目,我不希望NAs替換當前條目lepsp。這裏是當前數據幀:

df1<- data.frame(ID= seq(1,10, 1), 
       lepsp= c("A", "B", "", "C", "B", "","", "A", "B" , "C")) 
    df2<- data.frame(matchID= c("2","3", "8"), 
        lepsp_updates= c("C", "E", "B")) 

輸出將如下所示:對於ID 2 B

output<- data.frame(ID= seq(1,10, 1), 
       lepsp= c("A", "C", "E", "C", "B", "","", "B", "B" , "C")) 

通知與C和ID3 E的替換替換空白條目。 df1的所有其他原始條目保持不變。

我已經試過的版本:

df1$lepsp<- df2$lepsp_updated[match(df1$ID, df2$matchID)] 

或添加一列與更新DF1,然後合併列。

df1 <- transform(df1, lepsp_updated = ifelse(is.na(lepsp_updated),lepsp, lepsp_updated)) 

但是因素被改變爲數字或數據被覆蓋,只有一個因子水平的數據仍然存在。

回答

1

這是你在找什麼?

library(tidyverse) 

df1 <- data.frame(ID = seq(1, 10, 1), 
       lepsp = c("A", "B", "", "C", "B", "", "", "A", "B" , "C"), 
       stringsAsFactors = FALSE) 

df2 <- data.frame(matchID = c("2", "3", "8"), 
       lepsp_updates = c("C", "E", "B"), 
       stringsAsFactors = FALSE) 

df2$matchID <- as.numeric(df2$matchID) 

left_join(df1, df2, by = c("ID" = "matchID")) %>% 
    mutate(lepsp = if_else(is.na(lepsp_updates), lepsp, lepsp_updates)) %>% 
    select(ID, lepsp) 

將返回:

# ID lepsp 
# 1 1  A 
# 2 2  C 
# 3 3  E 
# 4 4  C 
# 5 5  B 
# 6 6  
# 7 7  
# 8 8  B 
# 9 9  B 
# 10 10  C 

請注意,您必須包括stringsAsFactors = FALSE論點data.frame,你還需要將matchID轉換爲數字,如果你想實現此解決辦法。

另外,將空白字符轉換爲NA可能是個好主意。您可以通過添加額外的mutate到鏈做到這一點:

left_join(df1, df2, by = c("ID" = "matchID")) %>% 
    mutate(lepsp = if_else(is.na(lepsp_updates), lepsp, lepsp_updates)) %>% 
    select(ID, lepsp) %>% 
    mutate_all(funs(replace(., . == '', NA))) 

# ID lepsp 
# 1 1  A 
# 2 2  C 
# 3 3  E 
# 4 4  C 
# 5 5  B 
# 6 6 <NA> 
# 7 7 <NA> 
# 8 8  B 
# 9 9  B 
# 10 10  C 

或者,您可以在空白字符轉換爲NA與基礎R:

df <- left_join(df1, df2, by = c("ID" = "matchID")) %>% 
    mutate(lepsp = if_else(is.na(lepsp_updates), lepsp, lepsp_updates)) %>% 
    select(ID, lepsp) 

df[df == ""] = NA 
相關問題