2017-10-05 11 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。たとえば、characterID = 12を照会すると、このデータセットを取得する必要があります。

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

このデータテーブルのサブセットはどのように見えますか?私は具体的にデータテーブル [characterID = 12、1:3、情報]の形で何かを探しています。

+1

'のDF [%DF $ matchIDでDF $ matchID%[DF $ characterID == 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] 

それとも

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

それとも

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

最後の3つは私が探しているものです、ありがとうございます。 3つの計算の複雑さに違いはありますか? – Alex

+0

@Alex '.I'はより速くなります – akrun

+0

セルフジョインはあまりにも仕事をするようです マージ(Y [characterID == 12、" matchID "]、Y、by =" matchID ") – ashleych

関連する問題