我有一个包含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)
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>