簡體   English   中英

用另一個因子的水平替換因子的水平

[英]Replace levels of factor with levels of another factor

我有一個數據幀df1 ,其因子稱為lepspID ,第二個數據幀df2 ,其因子稱為lepsp_updatesmatchID 我需要用df2中的lepsp_updates中的更新所有df1中的lepsp信息。

這將需要覆蓋/替換一些當前的lepsp等級,或填寫該列的空白條目。 但是,當前lepsp_updates具有許多條目的NA ,我不希望NA代替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"))  

輸出如下所示:

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

將ID 2 B的通知替換為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))

但是,因子要么更改為數字,要么數據被覆蓋,僅保留一個因子級別的數據。

這是您要找的東西嗎?

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包含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

或者,您可以將空白字符轉換為以R為基數的NA

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM