首页 > 解决方案 > 计算每个变量的唯一真/假

问题描述

我有这样的交易数据

library(data.table)
library(stringr)
sample <- data.table (customerid=c(1,1,2,2,2,3,4,4,5,5,6,6,6,7,7), 
                  product=c("A","A+B","A","A+B+C","A+C","B","B+C+D","C+D","A+D","A+B+D","A+B","A","A+C","B+D","D"))

我正在尝试计算每个客户总共购买了多少产品并将其添加到列名中total_product

我在 data.table 中尝试了这段代码

sample[, A:= str_detect(product,"A")]
sample[, B:= str_detect(product,"B")]
sample[, C:= str_detect(product,"C")]
sample[, C:= str_detect(product,"D")]
sample

代码返回

     customerid product A     B     C     D
1:          1       A  TRUE FALSE FALSE FALSE
2:          1     A+B  TRUE  TRUE FALSE FALSE
3:          2       A  TRUE FALSE FALSE FALSE
4:          2   A+B+C  TRUE  TRUE  TRUE FALSE
5:          2     A+C  TRUE FALSE  TRUE FALSE
6:          3       B FALSE  TRUE FALSE FALSE
7:          4   B+C+D FALSE  TRUE  TRUE  TRUE
8:          4     C+D FALSE FALSE  TRUE  TRUE
9:          5     A+D  TRUE FALSE FALSE  TRUE
10:         5   A+B+D  TRUE  TRUE FALSE  TRUE
11:         6     A+B  TRUE  TRUE FALSE FALSE
12:         6       A  TRUE FALSE FALSE FALSE
13:         6     A+C  TRUE FALSE  TRUE FALSE
14:         7     B+D FALSE  TRUE FALSE  TRUE
15:         7       D FALSE FALSE FALSE  TRUE

我在 Stack 上看到一个问题,我应该合并四c(A,B,C,D)列并计算,TRUE 但在我的情况下,我将多次计算相同的产品。

谢谢你的建议!

标签: rstring

解决方案


我们可以lapply在模式向量 ( LETTERS[1:4]) 上使用并指定函数的参数str_detect

sample[, LETTERS[1:4] := lapply(LETTERS[1:4], str_detect, string = product)]

或使用匿名/lambda 函数

sample[, LETTERS[1:4] := lapply(LETTERS[1:4], function(x) 
            str_detect(product, x))]

然后创建“total_product”计数作为sum逻辑向量的行,即 TRUE -> 1 和 FALSE -> 0

sample[, total_product := rowSums(.SD), .SDcols = A:D]

如果我们想为每个“customerid”计算“product”中的唯一元素,一个选项是用 拆分列,用strsplit获取唯一计数uniqueN

sample[, .(total_product = uniqueN(unlist(strsplit(product, 
             '+', fixed = TRUE)))), by = customerid]

-输出

#     customerid total_product
#1:          1             2
#2:          2             3
#3:          3             1
#4:          4             3
#5:          5             3
#6:          6             3
#7:          7             2

推荐阅读