首页 > 解决方案 > 将数据框转换为 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。

标签: rdataframematrixbinary

解决方案


这很容易用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>

推荐阅读