2017-11-03 166 views
0

我有我想要比较的电子邮件数据。为了收集数据,我必须从不同的表格中发送,交付,打开等等,所以我基本上有5个具有相同信息的数据帧,但发送表具有邮寄的100%的用户ID。交付,开放等表格包含完全相同的变量/列,但只是越来越少的行,因为不是每个人发送电子邮件打开它,点击它等。R:比较两个表中的列是否有缺失值,并在新列中产生True False

我想do将所有这些组合到发送的数据帧中,创建一个新的列,每个用户都有一个Y/N表示该用户是否收到该电子邮件,通过比较是否存在后续表中的USER ID来打开它,单击它。所以有点半连接,但我只是想在第一个表中创建一个新列,以表明每个唯一的USER ID是否存在于其他表中。简单的例子,我有下面两个表中的每一个的第一列。

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

尝试使用mutate匹配,然后与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 

当然,你的变量的名字会有所不同。但是这个方法就是这个。

编辑。
这是另一种方式,如果你不想得到类factor的结果。

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

EDIT 2
注意,代替TRUE/FALSE有可能的逻辑值转换成二进制整数中的许多方面。更可读的将是使用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记录,因此无法逐个输入值。有没有办法做到这一点,当我可以只列出专栏?或者至少将它们拉入矢量并以这种方式工作? –

+0

标签'N/Y'是否正确?如果是这样,你总是可以命名列,上面的变量'x'和'y'将被视为这些列的名称。你可以做'发送$ USER_ID%在%Delivered $ USER_ID'。 –

+0

Rui,Wwhen我说'名字列'我的意思是参考列。我的理想解决方案是简单地向'发送'文件添加一个新列,如果'已发送'中的用户ID(行)在'已发送'中匹配,那么将在该用户标识的新列中输入Y.如果发送的用户标识在传送的文件中没有匹配,那么该行将获得N值。这是否更有意义?它看起来像使用%in%函数后,我得到TRUE/FALSE,这将工作,而不是Y/N。所以看起来你的解决方案有效,但只是想确认它正在做我认为的事情。 –

相关问题