merge - match vector against dataframe with multiple entries in R -
i have following 2 dataframes:
>df1<-data.frame(id=c(111,222,333,444)) id 1 111 2 222 3 333 4 444 >df2<-data.frame(id=c(111,111,111,222,333,333,444,444,444,444,444,444),code=c(1,1,2,3,2,3,4,5,2,3,4,5)) id code 1 111 1 2 111 1 3 111 2 4 222 3 5 333 2 6 333 3 7 444 4 8 444 5 9 444 2 10 444 3 11 444 4 12 444 5 and match id elements in df1 against id elements in df2, produce third dataframe looks this:
> df3<-data.frame(id=c(111,222,333,444),code1=c(1,3,2,4),code2=c(1,na,3,5),code3=c(2,na,na,2),code4=c(na,na,na,3),code5=c(na,na,na,4),code6=c(na,na,na,5)) id code1 code2 code3 code4 code5 code6 1 111 1 1 2 na na na 2 222 3 na na na na na 3 333 2 3 na na na na 4 444 4 5 2 3 4 5 note df2 contains multiple codes several of id elements in df1. df3 reflect including column each of codes associated id elements.
thank in advance , suggestions.
this "long-to-wide" reshape problem, don't have "time" variable. can use ave plus seq_along create one, this:
df2$time <- ave(df2$id, df2$id, fun = seq_along) df2 # id code time # 1 111 1 1 # 2 111 1 2 # 3 111 2 3 # 4 222 3 1 # 5 333 2 1 # 6 333 3 2 # 7 444 4 1 # 8 444 5 2 # 9 444 2 3 # 10 444 3 4 # 11 444 4 5 # 12 444 5 6 now, can use either base r's reshape....
reshape(df2, direction = "wide", idvar = "id", timevar = "time") # id code.1 code.2 code.3 code.4 code.5 code.6 # 1 111 1 1 2 na na na # 4 222 3 na na na na na # 5 333 2 3 na na na na # 7 444 4 5 2 3 4 5 ... or dcast "reshape2"
library(reshape2) dcast(df2, id ~ time, value.var="code") # id 1 2 3 4 5 6 # 1 111 1 1 2 na na na # 2 222 3 na na na na na # 3 333 2 3 na na na na # 4 444 4 5 2 3 4 5
Comments
Post a Comment