Объединить значения столбцов, если дублируется другой столбец - PullRequest
0 голосов
/ 25 февраля 2020

У меня есть датафрейм с ~ 10 тыс. Строк. Существует около 100 строк с дублированными значениями PMID и несколькими уровнями фазовой переменной.

> head(df_pn)
# A tibble: 6 x 7
# Groups:   phase [1]
  PMID      year month   day phase   date       monthly   
  <chr>    <dbl> <dbl> <dbl> <chr>   <date>     <date>    
1 29287749  2017    12    31 Phase 1 2017-12-31 2017-12-01
2 29275332  2017    12    25 Phase 1 2017-12-25 2017-12-01
3 29127910  2017    11    12 Phase 1 2017-11-12 2017-11-01
4 29103339  2017    11     7 Phase 1 2017-11-07 2017-11-01
5 28964890  2017    10     2 Phase 1 2017-10-02 2017-10-01
6 28963724  2017    10     1 Phase 1 2017-10-01 2017-10-01
> 

Вот таблица данных, отсортированная для большего смысла этого:

> df_pn %>%
+   group_by(PMID) %>%
+   filter(n()>1) %>%
+   arrange(PMID)
# A tibble: 229 x 7
# Groups:   PMID [114]
   PMID      year month   day phase   date       monthly   
   <chr>    <dbl> <dbl> <dbl> <chr>   <date>     <date>    
 1 10554105  1999    12    20 Phase 1 1999-12-20 1999-12-01
 2 10554105  1999    12    20 Phase 2 1999-12-20 1999-12-01
 3 10555022  1999    11    11 Phase 1 1999-11-11 1999-11-01
 4 10555022  1999    11    11 Phase 2 1999-11-11 1999-11-01
 5 10743796  2000     4     1 Phase 1 2000-04-01 2000-04-01
 6 10743796  2000     4     1 Phase 2 2000-04-01 2000-04-01
 7 11315914  2001     4    24 Phase 1 2001-04-24 2001-04-01
 8 11315914  2001     4    24 Phase 2 2001-04-24 2001-04-01
 9 11349741  2001     5    15 Phase 1 2001-05-15 2001-05-01
10 11349741  2001     5    15 Phase 2 2001-05-15 2001-05-01
# … with 219 more rows

Я хотел бы объединить строки, имеющие одинаковый PMID, и одновременно объединить переменную фазы. Будут только уникальные значения PMID, и будет несколько новых уровней переменной фазы (вместо «Фаза 1» и «Фаза 2» будут оба из них плюс «Фаза 1 и Фаза 2.», чтобы сделать это еще более К сожалению, есть несколько PMID, у которых есть Фаза 1 / Фаза 2 / Фаза 3. Раздражающие.

Пробовали это несколькими способами, используя slice и group_by и соединение, и это просто не работает хорошо. любая помощь!

1 Ответ

2 голосов
/ 25 февраля 2020

Если предположить, что случаи в пределах PMID отличаются только для переменной phase, вы можете попробовать:

library(dplyr)

df_pn %>%
  group_by_at(vars(-phase)) %>%
  summarise(phase = toString(phase))

# A tibble: 5 x 7
# Groups:   PMID, year, month, day, date [5]
      PMID  year month   day date       monthly    phase           
     <int> <int> <int> <int> <chr>      <chr>      <chr>           
1 10554105  1999    12    20 1999-12-20 1999-12-01 Phase 1, Phase 2
2 10555022  1999    11    11 1999-11-11 1999-11-01 Phase 1, Phase 2
3 10743796  2000     4     1 2000-04-01 2000-04-01 Phase 1, Phase 2
4 11315914  2001     4    24 2001-04-24 2001-04-01 Phase 1, Phase 2
5 11349741  2001     5    15 2001-05-15 2001-05-01 Phase 1, Phase 2
...