我有我想要比较的电子邮件数据。为了收集数据,我必须从单独的表中提取,交付,打开等,所以我基本上有5个数据框具有相同的信息,但发送表有100%的邮件用户ID。交付,打开等表包含完全相同的变量/列,但行数越来越少,因为不是每个发送电子邮件的人都打开它,点击它等等。
我想要做的是将所有这些组合到已发送的数据框中,创建一个新列,每个用户都有一个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 with match,然后使用ifelse,但到目前为止没有骰子。
谢谢!
答案 0 :(得分: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"
编辑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"))