长到宽的转换,无需创建列表和空值

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

这是我的上一篇文章的后续问题。
我的数据框根据日期安排特定 PK 的访问,其中有一列:

  • 访问号码
  • 参观日期
  • 在那次访问中完成了考试

我正在尝试将其转回宽数据框。其中,每一行都是一次访问,每种测试类型都有一列。对于每次访问,列

对该数据框进行净值计算:

# A tibble: 14 × 9
# Groups:   PK, visit [7]
   PK        visit test         date       toddler module1   rbs   srs adi_score
   <chr>     <dbl> <chr>        <date>       <dbl>   <dbl> <dbl> <dbl>     <dbl>
 1 683865865     1 date_toddler 2020-12-08       7      NA    NA    NA        NA
 2 683865865     2 date_toddler 2021-11-10      10      NA    NA    NA        NA
 3 683865865     3 date_module1 2022-02-10      NA      10    NA    NA        NA
 4 683865865     4 date_module1 2022-08-24      NA      10    NA    NA        NA
 5 683865865     4 date_srs_pr  2022-08-24      NA      NA    NA    79        NA
 6 683865865     5 date_srs_pr  2023-01-12      NA      NA    NA    83        NA
 7 683865865     6 date_module1 2023-08-21      NA      10    NA    NA        NA
 8 683865865     6 date_srs_pr  2023-09-21      NA      NA    NA    90        NA
 9 683865865    NA date_adi     NA              NA      NA    NA    NA        NA
10 683865865    NA date_module2 NA              NA      NA    NA    NA        NA
11 683865865    NA date_module3 NA              NA      NA    NA    NA        NA
12 683865865    NA date_module4 NA              NA      NA    NA    NA        NA
13 683865865    NA date_rbsr    NA              NA      NA    NA    NA        NA
14 683865865    NA date_srs_sch NA              NA      NA    NA    NA        NA

所需数据示例:

         PK visit  toddler   module1   rbs   srs  adi_score
1 683865865     1        7        NA    NA    NA         NA
2 683865865     2       10        NA    NA    NA         NA  
3 683865865     3       NA        10    NA    NA         NA
4 683865865     4       NA        10    NA    79         NA
5 683865865     5       NA        NA    NA    83         NA
6 683865865     6       NA        10    NA    90         NA

我尝试过融为长,然后再次融为宽,但是因为有多个 ID,每个 ID 的访问量不同,所以我得到的是 LISTS 和 NULLS 中的值。

"Warning message:
Values from `adi_score`, `ados_module1`, `ados_module2`, `ados_module3`, `ados_module4`, `ados_toddler`,
`rbsr_score`, `srs_preschool` and `srs_school` are not uniquely identified; output will contain list-cols.
• Use `values_fn = list` to suppress this warning.
• Use `values_fn = {summary_fun}` to summarise duplicates.
• Use the following dplyr code to identify duplicates."
r dataframe merge long-format-data wide-format-data
1个回答
0
投票

在 tidyverse 中您可以使用以下内容:

library(tidyverse)
df%>%
  filter(!if_all(date:adi_score, is.na)) %>% 
  summarise(across(toddler:adi_score, ~na.omit(.x)[1]), .by=c(PK, visit))

         PK visit toddler module1 rbs srs adi_score
1 683865865     1       7      NA  NA  NA        NA
2 683865865     2      10      NA  NA  NA        NA
3 683865865     3      NA      10  NA  NA        NA
4 683865865     4      NA      10  NA  79        NA
5 683865865     5      NA      NA  NA  83        NA
6 683865865     6      NA      10  NA  90        NA
© www.soinside.com 2019 - 2024. All rights reserved.