将数据从每人多行转移到R中每人一行

问题描述 投票:0回答:1

我有显示每个人的喜糖偏好的数据集。每个人都有多行来显示他们喜欢的所有糖果,如下所示。

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函数,但是我相信它不起作用,因为每个人的行数是可变的。

有没有办法在R中实现这一目标?我不太确定如何解决这个问题。

r dataframe dplyr reshape spread
1个回答
0
投票

您可以通过ID和名称来summarise()数据,使用toString()来折叠candy变量,然后将其分成单独的列:

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  
© www.soinside.com 2019 - 2024. All rights reserved.