Транспонировать данные из нескольких строк на человека в одну строку на человека в R - PullRequest
0 голосов
/ 13 февраля 2020

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

Name      ID      Candy
Alex      101     Kit Kat
Alex      101     Twix
Sam       102     Reeses
Charlie   103     Skittles
Charlie   103     Twix
Charlie   103     Kit Kat
Charlie   103     Hershey
Nia       104     M&M
Nia       104     Skittles
Nia       104     Reeses
...

Я хочу преобразовать это в набор данных на уровне человека, где столбцы Candy ограничены первыми 3 в списке.

Name      ID     Candy 1    Candy 2    Candy 3
Alex      101    Kit Kat    Twix       NA
Sam       102    Reeses     NA         NA
Charlie   103    Skittles   Twix       Kit Kat
Nia       104    M&M        Skittles   Reeses

Первоначально я пытался использовать функцию Spread, но я считаю, что она не работает, потому что число строк на человека является переменным.

Есть ли способ добиться этого в Р? Я не совсем уверен, как подойти к этой проблеме.

1 Ответ

0 голосов
/ 13 февраля 2020

Вы можете summarise() данные по идентификатору и имени, используйте toString(), чтобы свернуть переменную конфеты, а затем разделить ее на отдельные столбцы:

library(tidyr)
library(dplyr)

df %>%
  group_by(ID, Name) %>%
  summarise(Candy = toString(Candy)) %>%
  separate(Candy, into = paste0("Candy", 1:3), sep = ", ", fill = "right", extra = "drop")

# A tibble: 4 x 5
# Groups:   ID [4]
     ID Name    Candy1   Candy2   Candy3 
  <int> <chr>   <chr>    <chr>    <chr>  
1   101 Alex    Kit Kat  Twix     NA     
2   102 Sam     Reeses   NA       NA     
3   103 Charlie Skittles Twix     Kit Kat
4   104 Nia     M&M      Skittles Reeses  
...