私はどのように一言で言うかさえ確信している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スタイルの簡単な方法があれば、ぜひご覧ください。
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
>
関数merge
が必要です。
merge
は一般的に、2つのテーブルを1つの類似したコモンでマージするために使用されますが、by
引数は複数の列を許可できます。
_merge(testData, testBounced, by=c("Email", "Campaign"))
_
一致しないEmail
とCampaign
のすべてのペアは、デフォルトで破棄されます。これは、引数_all.x
_および_all.y
_で制御できます。デフォルトはFALSE
です。
by
のデフォルトの引数はintersect(names(x, y))
であるため、技術的にはこの場合に列を指定する必要はありませんが、わかりやすくするために役立ちます。