【问题标题】:R - merge information of the same elements in one row [duplicate]R - 在一行中合并相同元素的信息[重复]
【发布时间】:2021-07-14 07:57:46
【问题描述】:

假设我有以下data.frame。学生最多可以尝试 3 次测验。

df <- data.frame(id = c(1, 1, 2, 3, 3, 3), points = c(3, 4, 5, 2, 6, 8), value = c(5, 5, 6, 8, 6, 2))
df

#>   student points time
#> 1       1      3    5
#> 2       1      4    5
#> 3       2      5    6
#> 4       3      2    8
#> 5       3      6    6
#> 6       3      8    2

现在我希望 data.frame 看起来像这样

#> id points-a time-a points-b time-b  points-c time-c
#>  1        3      5        4      5        NA     NA
#>  2        5      6       NA     NA        NA     NA
#>  3        2      8        6      6         8      2

每个学生只有一行,列中有不同的点和时间。 我怎样才能做到这一点?

【问题讨论】:

  • 问题是我在这个问题中没有像变量numbers 这样的变量,我可以使用它来进行整形。我的数据比我的示例中的要多得多,每个学生的尝试次数也不同,所以有时一个特定学生只有一行,有时有 4 行。我相信这可能很容易解决,但是我对 R 很陌生。

标签: r dataframe merge row


【解决方案1】:

使用reshape 的基本 R 选项

reshape(
    transform(
        df,
        q = ave(id, id, FUN = seq_along)
    ),
    idvar = "id",
    timevar = "q",
    direction = "wide"
)

给予

  id points.1 value.1 points.2 value.2 points.3 value.3
1  1        3       5        4       5       NA      NA
3  2        5       6       NA      NA       NA      NA
4  3        2       8        6       6        8       2

【讨论】:

    【解决方案2】:

    这给出了所需的输出:

     df %>% 
      group_by(student) %>% 
      mutate(head = letters[row_number()]) %>%
      pivot_wider(id_cols = student, names_from = head, names_sep = "-", values_from = c(points, time)) %>% 
      pivot_longer(-student) %>% 
      arrange(str_sub(name, -1)) %>% 
      pivot_wider(student)
    

    group_by()mutate() 提供必要的列标题,然后 pivot_wider() 完成工作。

    最后三行给出了正确的顺序,尽管直接这样做可能更好。

    【讨论】:

      猜你喜欢
      • 2013-12-04
      • 1970-01-01
      • 2021-01-18
      • 2022-01-02
      • 2019-10-16
      • 1970-01-01
      • 1970-01-01
      • 2017-01-27
      • 1970-01-01
      相关资源
      最近更新 更多