Есть ли функция R для добавления столбцов путем умножения значения другого столбца? - PullRequest
0 голосов
/ 11 мая 2019

Я хочу сделать анализ ассоциации, но мне нужно привести мой фрейм данных в правильный формат, который показывает только транзакции.1) Как я могу умножить свой столбец «Подкатегория» на количество столбца «Количество»?

2) Как я могу сгруппировать транзакции по идентификатору заказа?

У меня есть этот df:

 `Order ID`        `Sub-Category` `Quantity`
  <chr>              <chr>             <dbl>

1 CA-2017-152156    Bookcases             2

2 CA-2017-152156    Chairs                3

3 CA-2017-138688    Labels                2

1) Я хочу это:

  `Order ID`     `Sub-Category` `Sub-Category2`   `Sub-Category3`
  <chr>          <chr>             <chr>           <chr>

1 CA-2017-152156 Bookcases        Bookcases         NULL

2 CA-2017-152156 Chairs             Chairs          Chairs

3 CA-2017-138688 Labels            Labels           NULL

(После этого я хочу объединить одинаковые идентификаторы заказа. Например, строки 1 и 2. У вас есть подсказка для этого?) Спасибо!

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Чтобы ответить на вопрос 1), используя tidyverse, один из способов - создать новый столбец rep есть каждые Sub-Category Quantity количество раз и сохранить его как одну строку в формате через запятую, а затем separate их в n столбцы.

library(tidyverse)

n <- max(df$Quantity)

df1 <- df %>%
         mutate(new = map2_chr(`Sub-Category`, Quantity, ~paste(rep(.x, .y), collapse = ","))) %>%
         separate(new, paste("Sub-Category", seq_len(n))) %>%
         select(-`Sub-Category`)

df1

#       Order ID  Quantity Sub-Category 1 Sub-Category 2 Sub-Category 3
#1 CA-2017-152156        2      Bookcases      Bookcases           <NA>
#2 CA-2017-152156        3         Chairs         Chairs         Chairs
#3 CA-2017-138688        2         Labels         Labels           <NA>

Что касается вопроса 2), я не на 100% ясно понимаю, что вы ищете (поскольку ожидаемого результата нет), но я думаю, что вы ищете group_by Order ID исворачивать категории в один ряд для каждой группы?

df1 %>%
  group_by(`Order ID`) %>%
  summarise_at(vars(starts_with("Sub")), list(~paste(na.omit(.), collapse = ",")))

# A tibble: 2 x 4
#  `Order ID`   `Sub-Category 1` `Sub-Category 2` `Sub-Category 3`
#  <fct>          <chr>            <chr>            <chr>           
#1 CA-2017-138688 Labels           Labels           ""              
#2 CA-2017-152156 Bookcases,Chairs Bookcases,Chairs Chairs          
1 голос
/ 11 мая 2019

Следующие ответы к пункту 1).

Max <- max(df1$Quantity)
res <- lapply(seq_len(nrow(df1)), function(i){
  c(rep(as.character(df1[i, 2]), df1[i, 3]), rep(NA, Max - df1[i, 3]))
})
res <- cbind(df1[1], do.call(rbind, res))
names(res)[-1] <- paste0(names(df1)[2], names(res)[-1])

res
#        Order ID Sub-Category1 Sub-Category2 Sub-Category3
#1 CA-2017-152156     Bookcases     Bookcases          <NA>
#2 CA-2017-152156        Chairs        Chairs        Chairs
#3 CA-2017-138688        Labels        Labels          <NA>

Данные в формате dput.

df1 <-
structure(list(`Order ID` = structure(c(2L, 2L, 1L), 
.Label = c("CA-2017-138688", "CA-2017-152156"), 
class = "factor"), `Sub-Category` = structure(1:3, 
.Label = c("Bookcases", "Chairs", "Labels"), class = 
"factor"), Quantity = c(2L, 3L, 2L)), class = "data.frame", 
row.names = c("1", "2", "3"))
...