2017-11-03 4 views
0

私は比較したい電子メールデータを持っています。データを収集するには、別々のテーブルから送信、配信、公開などを引き出す必要があったので、基本的に同じ情報を持つ5つのデータフレームがありますが、送信テーブルには100%のユーザーIDが郵送されています。配信、オープンなどのテーブルには、同じ変数/列が含まれていますが、メールを送信したすべての人がそれを開いたりクリックしたりしていないため、行の数は少なくなります。R:2つのテーブルの列を比較して欠損値を比較し、新しい列にTrue Falseを生成します。

これをすべて送信データフレームに組み込み、USER IDが後続の表に存在するかどうかを比較することによって、そのユーザーが電子メールを受信したかどうかを示すY/Nの新しい列を作成し、それを開いてクリックした。一種のセミジョインですが、最初のテーブルに新しいUSER IDが他のテーブルに存在するかどうかを示す列を作成したいだけです。簡略化された例では、私は下の2つの表のそれぞれから最初の列を持っています。

Sent  USER ID 1 3 17 26 35 124 
      Deliv? Y N Y N Y Y 
Delivered USER ID 1 17 35 124 

突然変異を使用して試してみましたが、ifelseを使って試しましたが、これまでのサイコロはありませんでした。

ありがとうございます!

答えて

0

以下を試してください。

x <- scan(text = "1 3 17 26 35 124") 
y <- scan(text = "1 17 35 124") 
z <- factor(x %in% y, labels = c("N", "Y")) 
z 
#[1] Y N Y N Y Y 
#Levels: N Y 

もちろん、変数の名前は異なります。しかし、方法はこれです。

EDIT。
クラスfactorの結果を望んでいない場合、別の方法です。代わりTRUE/FALSEのそれはいくつかの方法でバイナリ整数に論理値に変換することが可能です

z2 <- c("N", "Y")[(x %in% y) + 1L] 
z2 
#[1] "Y" "N" "Y" "N" "Y" "Y" 

EDIT 2
注意。読みやすい方はas.integerを使用してください。

z <- factor(as.integer(x %in% y), labels = c("N", "Y")) 

[他の二つの方法は、ゼロを追加するか、いずれかによって乗算する、ハックです:(x %in% y) + 0Lまたは(x %in% y)*1L]

次にあなたがこの結果にdata.frame sentで新しい列を作成します。

sent$Deliv <- z # or z2 

またはそれ以上の単純な、中間変数z(またはz2)を作成し、直接factor(...)を割り当てないでください。

sent$Deliv <- factor(as.integer(x %in% y), labels = c("N", "Y")) 
+0

お礼ありがとうございます。私が言及しておきたい、ここでの唯一の課題は、私が800Kレコードで作業していることです。値を1つずつ入力することはできません。列に名前を付けるだけの方法はありますか?または、少なくともそれらをベクターにプルして、それらの方法で作業しますか? –

+0

ラベル「N/Y」は正しいですか?もしあなたがいつも列に名前をつけることができれば、上の変数 'x'と' y'はそれらの列の名前とみなされます。あなたは 'Delivered $ USER_ID'で' Sent $ USER_ID% 'を実行できます。 –

+0

ルイ、私は 'カラムの名前を'と言いました。私の理想的な解決策は、単に「送信済み」ファイルに1つの新しい列を追加するだけで、「送信済み」のユーザーID(行)が「配信済み」に一致した場合、そのユーザーIDの新しい列にYが入力されます。'送信者'のユーザーIDが配信されたファイルに一致しない場合、その行はN値を取得します。それは理にかなっていますか? %関数で%を使用した後のように見えますが、TRUE/FALSEとなり、Y/Nの代わりに機能します。だからあなたの解決策が働いているように見えますが、それが私が思っていることをしていることを確認したいだけです。 –

関連する問題