распространение () в столбце определения - PullRequest
0 голосов
/ 20 декабря 2018

В основном для каждого идентификатора у меня есть набор идентификаторов продукта, и я попытался распределить их по определенным столбцам.каждый идентификатор может иметь только 5 product_id.Например:

id product_id 
1   305
1   402
2   200
1   305
3   402
3   402

, поэтому я выкладываю в виде двоичного результата, например:

id 305 402 200 
1   2   0   0
2   0   0   1
3   0   2   0

, но я бы хотел:

id  product1  product2 product3 product4... until 5 
1      305      305       0
2      200      0         0
3      402      402       0

, если у кого-то есть что-то чистое (яесть около 10K строк) Это было бы здорово!спасибо!

#this gives me the binary outcome
for (i in names(test2[2:18])) {
  test2$product1[test2[i] == 1 ] <- i
  }

#this is a try to iterate through each row but it s pretty bad

    for(i in 1:nrow(test2)){
  if(test2[i,1]== 1){

    test2$product1[i] <- colnames(test2[1])
  } else if(test2[i,1]==2){

    test2$product1[i] <- colnames(test2[1])
    test2$product2[i] <- colnames(test2[1])
  } else if(test2[i,1]==3){

    test2$product1[i] <- colnames(test2[1])
    test2$product2[i] <- colnames(test2[1])
    test2$product3[i] <- colnames(test2[1])
  } else if(test2[i,1]==4){

and so one...

ожидается:

id  product1  product2 product3 product4... until 5 
1      305      305       0
2      200      0         0
3      402      402       0

актуально:

id 305 402 200 
1   2   0   0
2   0   0   1
3   0   2   0

1 Ответ

0 голосов
/ 20 декабря 2018

Мы можем создать столбец последовательности по '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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...