将数据从每人多行转为 R 中每人一行
Transpose data from multiple rows per person to one row per person in R
我有显示每个人的糖果偏好的数据集。每个人都有多行显示他们喜欢的所有糖果,如下所示。
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 中实现这一点?我不太确定如何解决这个问题。
您可以 summarise()
按 ID 和名称的数据,使用 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
我有显示每个人的糖果偏好的数据集。每个人都有多行显示他们喜欢的所有糖果,如下所示。
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 中实现这一点?我不太确定如何解决这个问题。
您可以 summarise()
按 ID 和名称的数据,使用 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