2

簡単なdata.frameを作成しました:

data.frame(a = rep(LETTERS[1:4], each=4),
           b = c(sample(6,4),sample(6,4),sample(6,4),sample(6,4)))

   a b
1  A 6
2  A 4
3  A 2
4  A 3
5  B 5
6  B 1
7  B 3
8  B 6
9  C 2
10 C 3
11 C 5
12 C 1
13 D 4
14 D 5
15 D 1
16 D 3

列bの数字が列aの4文字すべてに表示されるdata.frameの行のみを保持するにはどうすればよいですか?したがって、たとえば、列bの番号3は、列aのA、B、C、およびDに表示されるため、保持する必要があります。

4

3 に答える 3

3

これは、再帰的交差を利用する少し異なるアプローチです。

set.seed(123)

df <- data.frame(a = rep(LETTERS[1:4], each=4),
                 b = c(sample(6,4),sample(6,4),sample(6,4),sample(6,4)))
with(df, df[b %in% Reduce(intersect, split(b, a)),])
   a b
3  A 6
4  A 3
5  B 6
7  B 3
10 C 3
11 C 6
14 D 3
16 D 6
于 2012-10-12T15:12:49.000 に答える
1

それxがあなたのデータフレームだとすると、

keep <- apply( x, 1,
              function( y ) all( LETTERS[1:4] %in% x[ x[,2] == y[2], 1 ] ) )

nrow( x )目的の行を選択するために使用できる長さのブール値ベクトルを提供します。

x[ keep, ]
于 2012-10-12T14:53:15.763 に答える
0

table()サブセット化に役立つように使用することもできます。

set.seed(123)
df <- data.frame(a = rep(LETTERS[1:4], each=4), 
                 b = c(sample(6,4), sample(6,4), sample(6,4), sample(6,4)))
df[df$b %in% which(colSums(table(df)) == length(unique(df$a))), ]
#    a b
# 3  A 6
# 4  A 3
# 5  B 6
# 7  B 3
# 10 C 3
# 11 C 6
# 14 D 3
# 16 D 6

アップデート

振り返ってみると、ave()ここでは非常に便利です。まず、条件に一致するベクターを作成します。

(counts <- ave(df$b, df$b, FUN = length))
# [1] 2 3 4 4 4 2 4 3 3 4 4 2 1 4 2 4

次に、目的の条件を一致させます。

df[counts == 4, ]
#    a b
# 3  A 6
# 4  A 3
# 5  B 6
# 7  B 3
# 10 C 3
# 11 C 6
# 14 D 3
# 16 D 6
于 2012-10-12T15:53:28.003 に答える