r - 计算每个变量的唯一真/假
问题描述
我有这样的交易数据
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
但在我的情况下,我将多次计算相同的产品。
谢谢你的建议!
解决方案
我们可以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
推荐阅读
- r - Rcpp 函数导致包崩溃
- python - selenium,python - 无论我将延迟设置为什么,WebDriverWait 都会有 60% 的时间超时
- php - 在 CI 之外访问已经生成的会话
- laravel - BelongsToMany 使用 Pivot Data 创建操作 - PHP Lighthouse Laravel
- node.js - 可以在 Hapi Js 后端使用 docusign-passport 策略吗?
- python - 如何从 Pycharm 推送到我在项目中复制/粘贴的 Github 文件?
- java - 如何在 java 中重复 AnimationSet?
- powershell - PowerShell 安装模块错误 - 未找到指定搜索条件和模块名称“PackageManagement”的匹配项
- javascript - 带有 ajax 加载数据的 Bootstrap .popover()
- c - 如果从 gdb 中的某个文件调用函数,如何中断