2017-01-23 35 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,感谢您的帮助。 –