Search code examples
rdatatable

R data table aggregate data in some columns to list


I have csv file with next data:

person_id;first_name;birth_date;gender;sample_number;label
1;Ann;01.01.1977;1;MID43;PrBadMedian
1;Ann;01.01.1977;1;MID43;IB15
1;Ann;01.01.1977;1;Center1577;PrBadMedian
1;Ann;01.01.1977;1;Center1577;IB15
2;Kate;01.01.1989;1;MID55;PrBadMedian
2;Kate;01.01.1989;1;MID55;IB15
2;Kate;01.01.1989;1;Center3127;PrBadMedian
2;Kate;01.01.1989;1;Center3127;IB15
3;Jane;01.01.1991;1;MID78;PrBadMedian
3;Jane;01.01.1991;1;MID78;IB15

Column with uniq key is person_id. Data is dublicated because in columns sample_number and label can by different data.

How can I aggregate data in this columns in list like bellow?

person_id;first_name;birth_date;gender;sample_number;label
1;Ann;01.01.1977;1;MID43,Center1577;PrBadMedian,IB15
2;Kate;01.01.1989;1;MID55,Center3127;PrBadMedian,IB15
3;Jane;01.01.1991;1;MID78;PrBadMedian,IB15

Solution

  • With tidyverse functions, group_by everything except label and sample_number and use summarise:

    library(tidyverse)
    
    df %>% 
      group_by(across(-c(sample_number, label))) %>% 
      summarise(across(c(sample_number, label), ~ paste(unique(.x), collapse = ",")))
    
    # A tibble: 3 x 6
    # Groups:   person_id, first_name, birth_date [3]
      person_id first_name birth_date gender sample_number    label           
          <int> <chr>      <chr>       <int> <chr>            <chr>           
    1         1 Ann        01.01.1977      1 MID43,Center1577 PrBadMedian,IB15
    2         2 Kate       01.01.1989      1 MID55,Center3127 PrBadMedian,IB15
    3         3 Jane       01.01.1991      1 MID78            PrBadMedian,IB15
    

    data

    df <- read.table(header = T, text = "person_id;first_name;birth_date;gender;sample_number;label
    1;Ann;01.01.1977;1;MID43;PrBadMedian
    1;Ann;01.01.1977;1;MID43;IB15
    1;Ann;01.01.1977;1;Center1577;PrBadMedian
    1;Ann;01.01.1977;1;Center1577;IB15
    2;Kate;01.01.1989;1;MID55;PrBadMedian
    2;Kate;01.01.1989;1;MID55;IB15
    2;Kate;01.01.1989;1;Center3127;PrBadMedian
    2;Kate;01.01.1989;1;Center3127;IB15
    3;Jane;01.01.1991;1;MID78;PrBadMedian
    3;Jane;01.01.1991;1;MID78;IB15", sep=";")