5

df1とをdf2次のように持つ:

df1 <- read.table(text =" x y z
                          1 1 1
                          1 2 1
                          1 1 2
                          2 1 1
                          2 2 2",header=TRUE)

df2 <- read.table(text =" a b c
                          1 1 1
                          1 2 8
                          1 1 2
                          2 6 2",header=TRUE)

次のような多くのことをデータに尋ねることができます。

 df2[ df2$b == 6 | df2$c == 8 ,] #any rows where b=6 plus c=8 in df2
 #and additive conditions
 df2[ df2$b == 6 & df2$c == 8 ,] # zero rows

data.frame 間:

 df1[ df1$z %in% df2$c ,] # rows in df1 where values in z are in c (allrows)

これにより、すべての行が得られます。

 df1[ (df1$x %in%  df2$a) &
      (df1$y %in%  df2$b) &
      (df1$z %in%  df2$c) ,]

しかし、これはあまりにもすべての行を私に与えるべきではありませdf1ん:

 df1[ df1$z %in% df2$c | df1$b == 9,]

私が本当に望んでいるのは、a、b、c がすべて同じ行内で同時に x、y、z に等しい df1 の行のみを取得するように、3 つの列条件でdf1anをサブセット化することです。df2実際のデータでは、3 つ以上の列がありますが、3 つの追加の列条件でサブセット化する必要があります。

したがって、結果の例のデータdf1をサブセット化すると、次のようになります。df2

df1
   1 1 1
   1 1 2

構文をいじるとさらに混乱し、SOの投稿はすべて私が望むもののバリエーションであり、実際には私にとってより多くの混乱につながります.

私はこれを行うことができると考えました:

 merge(df1,df2, by.x=c("x","y","z"),by.y=c("a","b","c"))

それは私が望むものを私に与えますが、私の[試みが間違っている理由を理解したいと思います。

4

1 に答える 1

7

を使用した優れたソリューションに加えてmerge(ありがとう、私はいつも忘れていmergeます)、これは次のように使用してベースで達成でき?interactionます。これには他のバリエーションがあるかもしれませんが、これは私が精通しているものです:

> df1[interaction(df1) %in% interaction(df2), ]

今あなたの質問に答えるために:最初に、私はタイプミス(修正された)があると思います:

df1[ df1$z %in% df2$c | df2$b == 9,] # second part should be df2$b == 9

最初の部分は次のように評価されるため、エラーが発生します

[1] TRUE TRUE TRUE TRUE TRUE

2番目の評価は次のとおりです。

[1] FALSE FALSE FALSE FALSE

|等しくない長さで操作を実行すると、エラーが発生します。

longer object length is not a multiple of shorter object length

編集:複数の列がある場合は、そのような相互作用を選択できます。たとえばdf1、最初の2つの列がの行と一致する行から取得する場合はdf2、次のようにするだけです。

> df1[interaction(df1[, 1:2]) %in% interaction(df2[, 1:2]), ]
于 2013-01-30T12:24:05.250 に答える