Мы можем создать столбец последовательности по 'id', а затем spread
.Обратите внимание, что просто spread
ing не будет иметь всех «продуктов» до 5, поскольку они отсутствуют в данных.Чтобы сделать это, создайте последовательность как factor
с levels
, указанным от 'product1' до 'product5', а в spread
укажите drop = FALSE
, чтобы не отбрасывать неиспользованные levels
library(tidyverse)
df1 %>%
group_by(id) %>%
mutate(product = factor(paste0('product', row_number()),
levels = paste0('product', 1:5))) %>%
spread(product, product_id, drop = FALSE, fill = 0)
# A tibble: 3 x 6
# Groups: id [3]
# id product1 product2 product3 product4 product5
# <int> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1 305 402 305 0 0
#2 2 200 0 0 0 0
#3 3 402 402 0 0 0
данные
df1 <- structure(list(id = c(1L, 1L, 2L, 1L, 3L, 3L), product_id = c(305L,
402L, 200L, 305L, 402L, 402L)), class = "data.frame", row.names = c(NA,
-6L))