我有想要比较的电子邮件数据。为了收集数据,我必须从不同的表中提取发送、交付、打开等,所以我基本上有5个信息相同的数据帧,但发送表中有100%的用户ID。传递、打开等表包含完全相同的变量/列,但行数越来越少,因为不是每个收到电子邮件的人都打开、点击等。
我想做的是将所有这些合并到发送的数据框中,创建一个新的列,通过比较user ID是否存在于后续表中,为每个用户指定一个Y/N,说明该用户是否收到了电子邮件、打开了电子邮件、单击了电子邮件。所以有点像半联接,但我只想在第一个表中创建一个新列,说明其他表中是否存在每个唯一的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
尝试使用匹配突变,然后使用ifelse,但到目前为止还没有骰子。
谢谢!
尝试以下操作。
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.framesent
中创建一个新列,结果如下。
sent$Deliv <- z # or z2
或者更简单的是,不要创建中间变量z
(或z2
)并直接分配factor(...)
。
sent$Deliv <- factor(as.integer(x %in% y), labels = c("N", "Y"))