2017-10-05 2 views
3

을 행하기보다는 데이터의 선택된 블록 당이되도록 data.table 필터링 다음 data.table모든 부분 집합이 나는 경우

 
matchID characterID info 
1111 4   abc 
1111 12   def 
1111 1   ghi 
2222 8   jkl 
2222 7   mno 
2222 3   pwr 
3333 9   abc 
3333 2   ghi 
33333 4   jkl 

내가 특정 characterIDs을 찾아 그것을 부분 집합,하지만 모든을 반환하려면 characterID와 연결된 matchID

 
matchID characterID info 
1111  4   abc 
1111  12   def 
1111  1   ghi 

무슨 data.table 부분 집합의 모습 : 나는 characterID = 12를 조회하는 경우 예를 들어,이 데이터 세트를 얻을해야합니까? 나는 구체적으로 데이터 테이블 [characterID = 12, 1 : 3, 정보]의 형태로 무엇인가 찾고있다.

+1

'안양'하지만 난이 아니라'데이터라고 생각합니다 [$ characterID의 == 안양 $ matchID [DF %에서 $ matchID %의 DF는] (12)]. 그것을하는 테이블의 방법. –

답변

3

우리는 일치 집합의 부분 집합을 얻을 수있는 기능을 만들려면 'characterID'

library(dplyr) 
f1 <- function(dat, charIDs) { 

     dat %>% 
      group_by(matchID) %>% 
      filter(all(charIDs %in% characterID)) 
    } 

우리는 행 filter에 같은 하나의 'ID'또는 여러 개의 ID를 전달할 수 있습니다

f1(df1, 12) 
# A tibble: 3 x 3 
# Groups: matchID [1] 
# matchID characterID info 
# <int>  <int> <chr> 
#1 1111   4 abc 
#2 1111   12 def 
#3 1111   1 ghi 

f1(df1, c(7, 3)) 
# A tibble: 3 x 3 
# Groups: matchID [1] 
# matchID characterID info 
# <int>  <int> <chr> 
#1 2222   8 jkl 
#2 2222   7 mno 
#3 2222   3 pwr 

우리는 또한 data.table 옵션을 사용할 수 있습니다

library(data.table) 
setDT(df1)[ , if(all(12 %in% characterID)) .SD, matchID] 
,451,515,

또는

setDT(df1)[ , .SD[all(12 %in% characterID)], matchID] 

또는

setDT(df1)[df1[ , .I[all(12 %in% characterID)], matchID]$V1] 
+1

마지막 세 가지는 내가 찾고있는 것입니다. 고마워요. 세 가지 사이에 계산상의 복잡성에는 어떤 차이가 있습니까? – Alex

+0

@Alex'.I'는 더 빠를 것입니다. – akrun

+0

자기 조인도 작업을 수행하는 것 같습니다. merge (Y [characterID == 12, "matchID"], Y, by = "matchID") – ashleych