web-dev-qa-db-ja.com

R特定の列が別の列と一致するデータフレームの行を見つける

私はどのように一言で言うかさえ確信しているRの質問があります、そしてこれに対する答えをまだ見つけることができませんでした。

「交差」したい2つのデータフレームがあり、列の値がtwo列で一致するすべての行を見つけます。 2つのintersect()およびwhich()ステートメントを&&で接続してみましたが、どちらもまだ必要なものを提供していません。

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

> testData
               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 [email protected] EIFLS0LS        1       0      0       0         0            0
2 [email protected] EIFLS0LS        1       0      0       0         0            0
3     [email protected] EIFLS0LS        1       0      0       0         0            0
4    [email protected] EIFLS0LS        1       0      0       0         0            0
5          [email protected] EIFLS0LS        1       0      0       0         0            0
6     [email protected] EIFLS0LS        1       0      0       0         0            0

> testBounced
               Email Campaign
1 [email protected]        1
2 [email protected]        2
3     [email protected]        2
4    [email protected]        1
5          [email protected]        1
6        [email protected]        1

ご覧のように、Eメール列に交差する値と、キャンペーン列から交差する値があります。両方の列が一致するtestDataのすべての行が必要です。

つまり:

               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 [email protected] EIFLS0LS        1       0      0       0         0            0
2    [email protected] EIFLS0LS        1       0      0       0         0            0
3          [email protected] EIFLS0LS        1       0      0       0         0            0

編集:

これらの列を見つける目的は、元の列の行を更新できるようにすることです。だから私が望む最終的な出力は:

> testData
               Email     Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1 [email protected] EIFLS0LS        1       1      0       0         0            0
2 [email protected] EIFLS0LS        1       0      0       0         0            0
3     [email protected] EIFLS0LS        1       0      0       0         0            0
4    [email protected] EIFLS0LS        1       1      0       0         0            0
5          [email protected] EIFLS0LS        1       1      0       0         0            0
6     [email protected] EIFLS0LS        1       0      0       0         0            0

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

EDIT2 ::

最終的にはforループを使用することになりましたが、何も素晴らしいことではありませんが、効率的ではありません。ただし、データセットはそれをすばやく実行するのに十分な大きさでした。 Rスタイルの簡単な方法があれば、ぜひご覧ください。

9
so13eit

data.tablesを使用し、照合する列のキーを使用すると、1行で目的を達成できます。

    tData[tBounce, Bounced := 1L]



完全なプロセスは次のとおりです。

library(data.table)
keys <- c("Email", "Campaign")
tData <- data.table(testData, key=keys)
tBounce <- data.table(testBounce, key=keys)

tData[tBounce, Bounced := 1L]

結果:

tData

                Email   Manual Campaign Bounced Opened Clicked ClickThru Unsubscribed
1:    [email protected] EIFLS0LS        1       1      0       0         0            0
2:     [email protected] EIFLS0LS        1       0      0       0         0            0
3:          [email protected] EIFLS0LS        1       1      0       0         0            0
4: [email protected] EIFLS0LS        1       0      0       0         0            0
5: [email protected] EIFLS0LS        1       1      0       0         0            0
6:     [email protected] EIFLS0LS        1       0      0       0         0            0
> 
7
Ricardo Saporta

関数mergeが必要です。

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

_merge(testData, testBounced, by=c("Email", "Campaign"))
_

一致しないEmailCampaignのすべてのペアは、デフォルトで破棄されます。これは、引数_all.x_および_all.y_で制御できます。デフォルトはFALSEです。

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

8
Señor O