我有显示每个人的喜糖偏好的数据集。每个人都有多行来显示他们喜欢的所有糖果,如下所示。
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中实现这一目标?我不太确定如何解决这个问题。
您可以通过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