R:比较两个表中的列以查找缺失值,并在新列中生成True False

时间:2017-11-03 22:29:41

标签: r compare match semi-join

我有我想要比较的电子邮件数据。为了收集数据,我必须从单独的表中提取,交付,打开等,所以我基本上有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,但到目前为止没有骰子。

谢谢!

1 个答案:

答案 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"))