2014-01-10 5 views
3

이 행이 다른 데이터 프레임과 공통적 인 행 번호를 찾고자하는 데이터 프레임이 있습니다. 문제는 명확하게하기 위해다른 데이터 프레임에서 컨디셔닝 데이터 프레임의 행 번호 선택

, 나는 데이터 프레임 A와 데이터 프레임 B가 있다고 가정 :

나는 DFA와 DFB이 경우, 동일한 이름과 재판이 DFA의 행 번호를 얻으려면
dfA <- data.frame(NAME = rep(c("a", "b"), each = 3), 
        TRIAL = rep(1:3, 2), 
        DATA = runif(6)) 
dfB <- data.frame(NAME = c("a", "b"), 
        TRIAL = c(2, 3)) 
dfA 
# NAME TRIAL  DATA 
# 1 a  1 0.62948592 
# 2 a  2 0.88041819 
# 3 a  3 0.02479411 
# 4 b  1 0.48031827 
# 5 b  2 0.86591315 
# 6 b  3 0.93448264 
dfB 
# NAME TRIAL 
# 1 a  2 
# 2 b  3 

, 행 번호는 2와 6입니다.

2, 3, 5, 6 행을 제공합니다. NAME과 TRIAL은 별도로 일치하며 작동하지 않습니다.

which(dfA$NAME %in% dfB$NAME & dfA$TRIAL %in% dfB$TRIAL) 
# 2 3 5 6 

그런 다음이 더미를 만들고이 열과 일치 시키려고했습니다. DFB에 여러 C 럼이있는 경우, 작품,하지만 코드는 ... 당신의 도움을

dfA$dummy <- paste0(dfA$NAME, dfA$TRIAL) 
dfB$dummy <- paste0(dfB$NAME, dfB$TRIAL) 
which(dfA$dummy %in% dfB$dummy) 
# 2 6 

문제를 해결하기 위해 더 나은 방법이 있는지 궁금 해요, 감사 자세한 될 것입니다!

merge(transform(dfA, row.num = 1:nrow(dfA)), dfB)$row.num 
# [1] 2 6 

을 그리고 당신은 dfA 서브 세트를 할 수 있도록 인덱스를 찾는 전체 목표 인 경우에, 당신은 단지 merge(dfA, dfB)을 수행 할 수 있습니다

답변

4

당신은 할 수 있습니다.

+0

매우 깔끔한, 감사합니다! – calbear

0

또는 사용은 중복 :

apply(dfB, 1, function(x) 
    which(duplicated(rbind(x, dfA[1:2])))-1) 
# [1] 2 6 
+0

하지만 병합 방식이 마음에 드네요 @flodel 더 좋았어요! –

+0

귀하의 의견을 주셔서 감사합니다, 중복의 영리한 사용, 내가 이해할 시간을 보내고 인정해야합니다 :) – calbear

관련 문제