【问题标题】:Transpose data from multiple rows per person to one row per person in R在R中将数据从每人多行转换为每人一行
【发布时间】:2020-02-12 21:45:14
【问题描述】:

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

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 中实现这一点?我不太确定如何解决这个问题。

【问题讨论】:

  • 对数据进行分组,每组取前 3 行,添加一列统计组内的行数,然后重塑

标签: r dataframe dplyr reshape spread


【解决方案1】:

您可以通过 ID 和名称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  

【讨论】:

    猜你喜欢
    • 2020-12-01
    • 2016-10-27
    • 2020-06-13
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多