轻松检查目标是否记录在其他变量中?

时间:2017-11-22 22:42:03

标签: r dataframe dplyr data.table plyr

我有客户ID,product_id1和product_id2。数据有客户'购买信息并按客户和时间排序,因此每个客户的第一行是最早的记录。
product_id1包括购买的商品 product_id2包含我想知道之前是否购买过每件商品的商品(从product_id1查询)。

对于每个客户的product_id2中的每个项目,我想创建一个虚拟变量,指示过去是否购买了product_id2中的每个项目。换句话说,第n行的product_id2中的值已显示在product_id1中第1~(n-1)行中至少有一次,purchase_before为1,否则为0.

所以我想创建" purchase_before"柱。

我可以通过使用for循环来实现它,但有没有有效的方法?

数据如下,

customer id      product_id1   product_id2     purchased_before
    1             112             113                 0
    1             115             114                 0
    1             113             113                 0
    1             114             113                 1
    1             115             114                 1
    ....
    2             112             115                 0
    2             115             112                 1
    2             113             113                 0

1 个答案:

答案 0 :(得分:0)

尝试以下方法:

dplyr

df %>%
    group_by(customer_id) %>%
    mutate(purchased_before = sapply(row_number(), function(x) {
               ifelse(product_id2[x] %in% product_id1[1:(x-1)], 1, 0)
           })
    )

base R

do.call(rbind, lapply(split(df, df$customer_id), function(x) {
    x$purchased_before <- sapply(seq_len(nrow(x)), function(y) {
        ifelse(x$product_id2[y] %in% x$product_id1[1:(y-1)], 1, 0)
    })
    x
}))

这里的主要内容是循环遍历product_id2列中的行号,并使用这些行号访问给定索引处的product_id2值以及来自1的product_id1值直到那个给定的指数。获得这些值后,您可以在match内执行简单的ifelse运算符。如果匹配,则指定1;或者0否则。

我希望这证明有用。