0

我有想要比较的电子邮件数据。为了收集数据,我必须从单独的表中提取发送、交付、打开等,所以我基本上有 5 个具有相同信息的数据帧,但发送表有 100% 的已邮寄用户 ID。交付、打开等表包含完全相同的变量/列,但行数越来越少,因为并非每个发送电子邮件的人都打开它、单击它等。

我想做的是将所有这些合并到发送的数据框中,创建一个新列,其中每个用户都有一个 Y/N,说明该用户是否收到电子邮件,打开它,单击,通过比较用户 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 和 match,然后使用 ifelse,但到目前为止还没有骰子。

谢谢!

4

1 回答 1

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

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

编辑。
如果您不想要 class 的结果,这是另一种方式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。]

sent然后,您将使用此结果在 data.frame 中创建一个新列。

sent$Deliv <- z    # or z2

或者更简单,不要创建中间变量z(或z2)并factor(...)直接赋值。

sent$Deliv <- factor(as.integer(x %in% y), labels = c("N", "Y"))
于 2017-11-03T22:34:23.677 回答