Search code examples
rdata-cleaning

Convert the values for a column relating to an ID to an additional row


I have a table with 3 columns ID, clinical condition 1 and clinical condition 2. The table is shown below

ID  clinical condition 1    clinical condition 2
2345    depression          dementia
2346    Tuberculosis    
2347    cancer  
2348    Flu                 dementia

I would like to make the following transformed table using base R

ID  clinical condition 1    
2345    depression          
2345    dementia
2346    Tuberculosis    
2347    cancer  
2348    Flu                 
2348    dementia

Can someone please help me solve this problem?


Solution

  • in base R:

    subset(cbind(df[1], stack(df[-1])[-2]), nzchar(values))
        ID       values
    1 2345   depression
    2 2346 Tuberculosis
    3 2347       cancer
    4 2348          Flu
    5 2345     dementia
    8 2348     dementia
    
    subset(reshape(df, list(2:3), dir="long"), nzchar(clinical_condition_1))
          ID time clinical_condition_1 id
    1.1 2345    1           depression  1
    2.1 2346    1         Tuberculosis  2
    3.1 2347    1               cancer  3
    4.1 2348    1                  Flu  4
    1.2 2345    2             dementia  1
    4.2 2348    2             dementia  4
    

    in Tidyverse:

    library(tidyverse)
    df %>%
       pivot_longer(-ID)%>%
       filter(nzchar(value))
    # A tibble: 6 × 3
         ID name                 value       
      <int> <chr>                <chr>       
    1  2345 clinical_condition_1 depression  
    2  2345 clinical_condition_2 dementia    
    3  2346 clinical_condition_1 Tuberculosis
    4  2347 clinical_condition_1 cancer      
    5  2348 clinical_condition_1 Flu         
    6  2348 clinical_condition_2 dementia    
       
    

    df <- structure(list(ID = 2345:2348, clinical_condition_1 = c("depression", 
    "Tuberculosis", "cancer", "Flu"), clinical_condition_2 = c("dementia", 
    "", "", "dementia")), class = "data.frame", row.names = c(NA, 
    -4L))