首页 > 解决方案 > 在基于新数据框的排序和分组数据上显示字段

问题描述

我有一个数据集,我希望在新数据框中显示汇总结果。到目前为止,我已经创建了前两列,它们是所有唯一 ID 和该 ID 的唯一案例编号的数量。现在我希望创建额外的列,将每个案例编号的“代码”显示为第一种情况、第二种情况等列。逻辑是,列会显示与案件编号对应的代码,如果案件编号相同,则首先显示日期最早的,然后在其后的列中显示较晚的。然后是同一ID的不同案件编号的其他“代码”。任何帮助将不胜感激,因为我不知道该怎么做,谢谢!

期望的结果:

     ID        cases.unique        1st Case     2nd Case    3rd Case    4th Case
 1   100            1                715.10      724.50
 2   200            2                717.00      300.02      366.90      444.22
 3   300            1                717.00
 4   400            1                465.80      785.00
 5   500            1                309.00

数据:

x <- data.frame("ID" = c(100, 100, 200, 200, 200, 200, 300, 400, 400, 500),
                "Case Number" = c(1111, 1111, 1000, 1000, 1001, 1001, 9999, 1422, 1422, 1522), 
                "Date" = c("2013/07/15", "2013/09/23", "2016/06/21", "2016/09/18", "2016/10/20", "2016/08/06", "2017/08/21", "2016/08/23", "2016/08/24","2016/08/14"),
                "Code" = c(715.1, 724.5,717,366.9,444.22,300.02,717,465.8,785,309.0))

到目前为止我所拥有的:

x2 <- x %>% 
  group_by(ID) %>% 
  summarize(
    cases.unique = n_distinct(Case.Number)
  )

标签: rdplyr

解决方案


您需要一个mutate而不是summarise,然后spread使用select删除不必要的列之后的数据。

library(tidyverse)
x %>% 
  group_by(ID) %>% 
  mutate(
    cases.unique = n_distinct(Case.Number),
    case = paste("case", 1:n())
  ) %>% 
  select(-Date, -Case.Number) %>% 
  spread(key = case, value  = Code, fill = "")


# A tibble: 5 x 6
# Groups:   ID [5]
     ID cases.unique `case 1` `case 2` `case 3` `case 4`
  <dbl>        <int> <chr>    <chr>    <chr>    <chr>   
1   100            1 715.1    724.5    ""       ""      
2   200            2 717      366.9    444.22   300.02  
3   300            1 717      ""       ""       ""      
4   400            1 465.8    785      ""       ""      
5   500            1 309      ""       ""       ""     

推荐阅读