2017-01-23 4 views
2

私はそれぞれ識別子を含む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の2番目の列をIDの一致によってdf2 $ Typeの値で作成したいとします。これは、最初のIDの一致を得て、この

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

代わりに私がしたいように私に何かを与えて、対応する値の上にもたらすでしょう、このマッチング方法を使用して、

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

しかし値

を検索するための私の通常の方法であります基本的にはループ上に、繰り返しIDごとに '次の'型の値を引き継ぐのが好きです。理想的には、出力をフォローしたいと思います。

おそらくユーザー定義関数で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溶液で行きました。突然変異の使用を助けてくれてありがとう。 –

関連する問題