2017-04-11 12 views
0

を持つ列に基づいてデータフレームは、私はので、私は唯一の「赤」と「黄」の両方を持っているG1のグループを含む新しいデータフレームのサブセットを望むものをデータフレームサブセット二つの属性

ds <- read.table(header = TRUE, text =" 
       g1 color 
       A red 
       A yellow 
       B red 
       C red 
       C yellow 
       ") 

を持っていると言います列の色で表示します。上記の例を使用した新しいテーブルにはBを含む行はありません。赤または黄色のサブセットにはまだ赤色の "B"しか含まれていないので、これにどう対処するかはわかりません。

ds[ds$color=="red" | ds$color=="yellow", ] 

ありがとう。

+0

あなたの例は 'data.table'に関するものではありません。 'data.frame'または' data.table'を使って解決策を探していますか? – jogo

+0

私はあなたが探しているものを理解していません。多分あなたは希望の出力を与えることができますか? – Puddlebunk

+1

@Puddlebunk OPは、グループBは条件に基づいて除外されると言います。それらの行を削除する以外に、テーブルは同じになると思います。 – Frank

答えて

1

あなたは行うことができます。

ds$col.count <- ave(as.integer(ds$color), ds$g1, FUN=function(x) length(unique(x))) 
ds[ds$col.count==2,] 

短い変異体である:

ave()の結果は数値ベクトルで ave()作品は、 as.logical()が必要とされているので as.integer()が必要とされている
ds[as.logical(ave(as.integer(ds$color), ds$g1, FUN=function(x) 2==length(unique(x)))), ] 

であるため、数値ベクトル。ここで

data.tableとソリューションです:

library(data.table) 
ds <- fread(header = TRUE, 
"g1 color 
A red 
A yellow 
B red 
C red 
C yellow") 
ds[, col.count:=length(unique(color)), by=g1][col.count==2] 

すべてのグループ内の各色が二度ではないことは明らかであるならば、あなたは、単に行うことができます:ここでは

ds[, col.count := .N, by = g1][col.count == 2] 
+0

フランクスのコメントからの解決策はとても良いです! – jogo

+0

私はあなたの答えを編集したことを願っています。 – Uwe

+0

@UweBlockこれは同じではありません。余分な行「赤色」がある場合。すべてのグループで、各色が2度にならないことが明らかであれば、それは同じです。 – jogo

0

は長いですdplyr yはave

ds[as.logical(ave(as.character(ds$color), ds$g1, 
        FUN=function(i) "red" %in% i & "yellow" %in% i)), ] 
    g1 color 
1 A red 
2 A yellow 
4 C red 
5 C yellow 
2

有する基地R法OUはシンプルgroup_by()filter()を使用することができます。

ds %>% group_by(g1) %>% filter(all(c("red","yellow") %in% color)) 

これは、あなたが一致する値の任意の数が可能になります。

関連する問題