Search code examples
rdataframereshape2melt

R: Collapse multiple boolean columns into single attribute column with new rows for each combination


Trying to melt or collapse a dataframe with multiple boolean columns into a two column database with an id column and a column for the collapsed values BUT each value results in a new row.

Example beginning:

      A S1 S2 S3 S4
1   ex1  1  0  0  0
2   ex2  0  1  0  0
3   ex3  0  0  1  0
4   ex4  1  1  0  0
5   ex5  0  1  0  1
6   ex6  0  1  0  0
7   ex7  1  1  1  0
8   ex8  0  1  1  0
9   ex9  0  0  1  0
10 ex10  1  0  0  0

Desired output:

A   Type
ex1 S1
ex2 S2
ex3 S3
ex4 S1
ex4 S2
ex5 S2
ex5 S4
ex6 S2
ex7 S1
ex7 S2
ex7 S3
ex8 S2
ex8 S3
ex9 S3
ex10 S1

Thanks in advance!


Solution

  • in base R:

     subset(cbind(A=dat[,1],stack(dat[-1])),values==1,-2)
          A ind
    1   ex1  S1
    4   ex4  S1
    7   ex7  S1
    10 ex10  S1
    12  ex2  S2
    14  ex4  S2
    15  ex5  S2
    16  ex6  S2
    17  ex7  S2
    18  ex8  S2
    23  ex3  S3
    27  ex7  S3
    28  ex8  S3
    29  ex9  S3
    35  ex5  S4
    

    In the tidyverse:

    library(tidyverse)
    dat%>%
       gather(Type,j,-A)%>%
       filter(j==1)%>%
       select(-j)
          A Type
    1   ex1   S1
    2   ex4   S1
    3   ex7   S1
    4  ex10   S1
    5   ex2   S2
    6   ex4   S2
    7   ex5   S2
    8   ex6   S2
    9   ex7   S2
    10  ex8   S2
    11  ex3   S3
    12  ex7   S3
    13  ex8   S3
    14  ex9   S3
    15  ex5   S4