2017-01-23 40 views
2

我有兩個數據框,每個都包含標識符。生成一個循環來匹配ID的

df1 <- data.frame(ID = c(20001, 20001, 20003, 20003, 20003, 20003)) 
df2 <- data.frame(ID = c(20001, 20001, 20003, 20003, 20003, 20005), 
        Type = c('N1', 'N2', 'N3', 'N4', 'N5', 'N6')) 

我想在df1中創建第二列,其值爲df2 $鍵入匹配的ID。這是我查找值

df1$Add <- df2$Type[match(df1$ID, df2$ID)] 

然而,使用這種匹配方法將獲得第一ID匹配,帶來了相應的值給我這樣

ID  Add 
20001 N1 
20001 N1 
20003 N3 
20003 N3 
20003 N3 
20003 N3 

相反,我會的東西通常的方法喜歡爲每個重複的ID帶來'下一個'類型值,基本上是在一個循環上。理想情況下,我想遵循輸出。

ID  Add 
20001 N1 
20001 N2 
20003 N3 
20003 N4 
20003 N5 
20003 N3 

我認爲它會需要一些使用可能用戶定義函數的lapply。

回答

2

這是你在找什麼?

library(dplyr) 
df1 %>% group_by(ID) %>% 
     mutate(c = rep(df2$Type[df2$ID == unique(ID)], length.out = n())) 

#  ID  c 
#1 20001  N1 
#2 20001  N2 
#3 20003  N3 
#4 20003  N4 
#5 20003  N5 
#6 20003  N3 

# incase of efficiency, 

library(data.table) 
setDT(df2) 
setDT(df1)[, x := rep(df2$Type[df2$ID == ID], length.out = .N),by = .(ID)] 

# i'm looking for a base R solution without involving merge 
# as of now my bet is on sapply() - but not utilised efficiently 

unlist(sapply(unique(df1$ID), function(x) rep(df2$Type[df2$ID == x], 
               length.out = sum(x==df1$ID)))) 
# [1] N1 N2 N3 N4 N5 N3 
+0

我去了dplyr解決方案,因爲它已經被加載的代碼之前的塊。大量使用mutate,感謝您的幫助。 –