Преобразование нескольких записей в одну строку с векторным столбцом в R

#r #data-cleaning

#r #очистка данных

Вопрос:

У меня есть набор данных с несколькими строками, который описывает одного пользователя. Я пытаюсь изменить свой набор данных так, чтобы одна строка представляла одного пользователя.

Воспроизводимый пример:

 old_way <- data.frame("Day" = 1:10, "Purchase" = 20:29, "Name" = c("John", "John", "John", "Dora", "Dora", "Dora", "Dora", "Gerald", "Gerald", "Gerald"), stringsAsFactors = FALSE)

   Day Purchase   Name
1    1       20   John
2    2       21   John
3    3       22   John
4    4       23   Dora
5    5       24   Dora
6    6       25   Dora
7    7       26   Dora
8    8       27 Gerald
9    9       28 Gerald
10  10       29 Gerald

 

Большая разница в том, что каждая строка теперь состоит из одного человека. Поэтому, когда я делаю записи, я могу очень легко увидеть, в какие дни они были здесь и какую покупку они совершили.

 desired_way <- data.frame("Name" = c("John","Dora","Gerald"), "Day" = c("1, 2, 3", "4, 5, 6, 7", "8, 9 ,10"), "Purchase" = c("20, 21, 22", "23, 24, 25, 26", "27, 28, 29"), "Last_Day" = c("3", "7", "10"), "Avg_Purchase" = c("21","25","28"))

    Name           Day          Purchase    Last_Day Avg_Purchase
1   John       1, 2, 3        20, 21, 22           3           21
2   Dora    4, 5, 6, 7    23, 24, 25, 26           7           25
3 Gerald      8, 9 ,10        27, 28, 29          10           28
 

Как я могу создать эту ячейку, которая инкапсулирует информацию о других строках? И поддерживает ли R операции, выполняемые с этой ячейкой, или мне нужно будет вычислять самые последние и средние значения при создании этой ячейки?

Заранее всем спасибо!

Ответ №1:

Возможно, было бы лучше сохранить его в a list вместо одной строки после выполнения группировки по «Имени»

 library(dplyr)
old_way %>% 
  group_by(Name) %>%
  summarise(Last_Day = last(Day), 
            Avg_Purchase = mean(Purchase), 
            Day = list(Day), Purchase = list(Purchase), .groups = 'drop')
 

-вывод

 # A tibble: 3 x 5
#  Name   Last_Day Avg_Purchase Day       Purchase 
#  <chr>     <int>        <dbl> <list>    <list>   
#1 Dora          7         24.5 <int [4]> <int [4]>
#2 Gerald       10         28   <int [3]> <int [3]>
#3 John          3         21   <int [3]> <int [3]>