10

私はRの質問を持っています.1つの文でどのように表現するかさえ確信があり、これに対する答えをまだ見つけることができませんでした.

「交差」させたい2つのデータフレームがあり、2つの列で列の値が一致するすべての行を見つけます。2 つの intersect() ステートメントと which() ステートメントを && で接続しようとしましたが、どちらも私が望むものをまだ与えていません。

これが私の言いたいことです。2 つのデータ フレームがあるとします。

> testData
               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 stack@overflow.com EIFLS0LS        1       0      0       0         0            0
2 stack@exchange.com EIFLS0LS        1       0      0       0         0            0
3     data@frame.com EIFLS0LS        1       0      0       0         0            0
4    block@quote.com EIFLS0LS        1       0      0       0         0            0
5          ht@ml.com EIFLS0LS        1       0      0       0         0            0
6     tele@phone.com EIFLS0LS        1       0      0       0         0            0

> testBounced
               Email Campaign
1 stack@overflow.com        1
2 stack@overflow.com        2
3     data@frame.com        2
4    block@quote.com        1
5          ht@ml.com        1
6        lap@top.com        1

ご覧のとおり、Email 列に交差する値と、Campaign 列に交差する値があります。両方の列が一致する testData のすべての行が必要です。

すなわち:

               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 stack@overflow.com EIFLS0LS        1       0      0       0         0            0
2    block@quote.com EIFLS0LS        1       0      0       0         0            0
3          ht@ml.com EIFLS0LS        1       0      0       0         0            0

編集:

これらの列を見つける際の私の目標は、元の列の行を更新できるようにすることです。したがって、私が望む最終的な出力は次のとおりです。

> testData
               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 stack@overflow.com EIFLS0LS        1       1      0       0         0            0
2 stack@exchange.com EIFLS0LS        1       0      0       0         0            0
3     data@frame.com EIFLS0LS        1       0      0       0         0            0
4    block@quote.com EIFLS0LS        1       1      0       0         0            0
5          ht@ml.com EIFLS0LS        1       1      0       0         0            0
6     tele@phone.com EIFLS0LS        1       0      0       0         0            0

これが重複している場合はお詫び申し上げます。ご協力いただきありがとうございます。

EDIT2::

私は for ループを使用することになりましたが、何も素晴らしいことはありませんが、効率的ではありません。ただし、データセットは十分に小さかったので、すぐに実行できました。誰かがそれを行うための迅速なRスタイルの方法を持っているなら、私はそれを見てうれしいです!

4

2 に答える 2

8

関数が必要ですmerge

merge一般に、2 つのテーブルを 1 つの類似したコモンでマージするために使用されますが、by引数は複数の列を許可できます。

merge(testData, testBounced, by=c("Email", "Campaign"))

一致しないEmailとのすべてのペアは、デフォルトで破棄されます。Campaignこれは引数all.xandall.yで制御でき、デフォルトはFALSEです。

のデフォルトの引数byintersect(names(x, y))であるため、技術的にはこの場合列を指定する必要はありませんが、わかりやすくするためには有効です。

于 2013-07-26T18:50:39.613 に答える