r - 将数据框转换为 R 中的二进制矩阵
问题描述
我有一个包含 2 列的数据框,customerID 和 StockCodes 描述了客户在一段时间内购买的股票代码。同一客户可能有多次观察,因为他可能多次购买相同的物品或在一段时间内购买不同的物品。样本数据如下所示:
CustomerID StockCode
12346 23166
12347 16008
12347 17021
12347 20665
12347 20719
12347 20719
12347 20719
12347 20719
12347 20780
12347 20782
12347 20966
12347 21035
我需要在 R 中转置数据框,以便所有股票代码都显示为没有任何重复的列,并且每一行都有一个不同的 customerID。我有两个问题:
如果客户至少有一个匹配的股票代码,则横截面单元格值将具有数字“1”,否则为 0。
如果有匹配的库存代码,则横截面单元格将包含每个客户拥有的库存代码的计数,否则为 0。
解决方案
这很容易用dplyr
和完成tidyr::pivot_wider
。
数据
example <- data.frame(CustomerID = c(12346, 12347, 12347, 12347, 12347, 12347),
StockCode = c(23166, 16008, 17021, 20665, 20719, 20719)
)
第 (1) 部分的代码
A <- example %>%
distinct %>%
mutate(Test = 1) %>%
tidyr::pivot_wider(values_from = Test, names_from = StockCode) %>%
replace(is.na(.), 0)
第 (1) 部分的输出
# A tibble: 2 x 6
CustomerID `23166` `16008` `17021`
<dbl> <dbl> <dbl> <dbl>
1 12346 1 0 0
2 12347 0 1 1
# ... with 2 more variables:
# `20665` <dbl>, `20719` <dbl>
第 (2) 部分的代码
B <- example %>%
group_by_all %>%
count %>%
tidyr::pivot_wider(values_from = n, names_from = StockCode) %>%
replace(is.na(.), 0)
第 (2) 部分的输出
> B
# A tibble: 2 x 6
# Groups: CustomerID [2]
CustomerID `23166` `16008` `17021`
<dbl> <int> <int> <int>
1 12346 1 0 0
2 12347 0 1 1
# ... with 2 more variables:
# `20665` <int>, `20719` <int>
推荐阅读
- java - 如何在 Java 中使用 for 循环编写最短路径问题
- ansible - 在剧本结束时打印出主机失败的任务?
- python - 蟒蛇 | 如何捕获文件不可读的异常
- php - 如何检查选择标签是否选择了一些值并获取值以通过 PHPMailer 发送?
- javascript - 我无法使用 FormGroup Angular 6 发出发布请求
- css - Bootstrap-4.3 中的多图像滑动轮播问题
- groovy - 有没有一种干净的方法可以在 Groovy 中指定 Closure 参数类型?
- php - PHP 创建租约计算器
- javascript - 如何阻止视图占用屏幕宽度并与 React Native 中的其他组件重叠?
- c# - 在 C# 插件中使用 ChromiumFX/ChromiumWebBrowser