2014-11-21 10 views
0

첫째,이 질문에 가능한 최선의 방법으로 표현하지 않으면 사과합니다. 저는이 말을 처음 접했으나 명확한 질문을 던지려고했습니다. 나는 내가 가지고있는한 데이터 프레임에서 다른 데이터 프레임으로 데이터 일치

다음과 같은 두 가지 데이터 프레임을 달성하기 위해 노력하고 그 중 하나에서 데이터를 가져 와서 다른에 새 열을 추가하는 것을 시도하고있다, 나는

IDa <- c(1,2,3) 
score1a <- c(5,10,1) 
score2a <- c(NA,8,NA) 
score3a <- c(NA,NA,13) 

dfa <- data.frame(IDa,score1a,score2a,score3a) 

IDb <- c(1,1,1,2,2,3) 
timeb <- c(1,2,3,2,3,3) 

dfb <- data.frame(IDb,timeb) 
다음이의 예를 만들었습니다

점수 1은 시간 1, 점수 2는 시간 2, 점수 3은 시간 3에 해당

내가 원하는 것은 해당 시점에 해당 시점에 해당하는 점수와 일치시키고 dfb에 추가 열로 추가합니다.

따라서 dfb는 알 칼럼 5, NA, NA, 8, NA, 13

희망이 있으시면 어떤 도움을 주셔서 감사합니다!

편집 : 나는 dfb에서 사용할 수있는 시간 지점을 볼 수 있듯이 반드시 추가해야합니다. 예를 들어 데이터는 dfa의 1 시점에서 ID = 2로 기록되지만 dfb는이 위치를 지정하지 않습니다 (지금은 ID = 2, timeb = 1 행), dfb의 데이터를 가능한 한 최상으로 채워야합니다.

답변

2

당신은 timeb 일치하도록 variable 열을 변환 후 dfadfbmerge 다음 형태 long에와 melt 수 있습니다.

library(reshape2) 
merge(dfb,transform(melt(dfa, id.var='IDa', na.rm=TRUE), 
      variable=as.numeric(factor(variable))), 
       by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable'), all.x=TRUE) 
# IDb timeb value 
#1 1  1  5 
#2 1  2 NA 
#3 1  3 NA 
#4 2  2  8 
#5 2  3 NA 
#6 3  3 13 

또는 다음에 열 이름을 변경하고는 merge

colnames(dfa)[-1] <- 1:3 
merge(dfb, melt(dfa, id.var='IDa'), 
     by.x=c('IDb', 'timeb'), by.y=c('IDa', 'variable')) 
2

또 다른 옵션이 될 것 수행

require(dplyr) 
require(tidyr) 

gather(dfa, Score, Val, -IDa) %>% 
    mutate(Score = as.numeric(gsub("[a-zA-Z]","", Score))) %>% 
    left_join(dfb, ., by = c("IDb" = "IDa", "timeb" = "Score")) 

# IDb timeb Val 
#1 1  1 5 
#2 1  2 NA 
#3 1  3 NA 
#4 2  2 8 
#5 2  3 NA 
#6 3  3 13 

단계는의 대답하지만, 다른 기능을 사용하여 akrun 유사합니다.

+0

정말 프로처럼 'dplyr'가 있습니다. –

+0

Tanks Richard :) –

관련 문제