将数据帧转换为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. 如果客户至少有一个匹配的股票代码,则截面单元格值将具有数字'1',否则为0。

  2. 横截面单元格将具有每个客户拥有的股票代码的计数,如果有匹配的股票代码,则为0。

这在dplyrtidyr::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)

Part(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)

Part(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>

最新更新