我有客户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
答案 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
否则。
我希望这证明有用。