convert data to transaction in Rstudio

Viewed 41

I have a data as follows and I want to convert it to transaction format at Rstudio.Please guide me

ID    P1 P2 P3 ....... p265                 ID     TRA
1     0  1  1  .......  0                   1      {P2,p3,....}
2     1  1  0  .......  1                   2      {P1,P2,...,P265}
3     0  0  1  .......  1                   3      {p3,...,p265}
.     .  .  .           .                   .      .
.     .  .  .           .                   .      .
.     .  .  .           .                   .      .
1000  1  0  1  .......  0                   1000   {p1,p3,...}
2 Answers
library(tidyverse)

df %>%
  group_by(ID) %>%
  pivot_longer(-ID) %>%
  filter(value>0) %>%
  summarise(TRA = str_c('{', toString(name), '}'))
  
# A tibble: 4 x 2
     ID TRA           
  <int> <chr>         
1     1 {P2, P3}      
2     2 {P1, P2, p265}
3     3 {P3, p265}    
4  1000 {P1, P3}   

Data:

df <- structure(list(ID = c(1L, 2L, 3L, 1000L), P1 = c(0L, 1L, 0L, 
1L), P2 = c(1L, 1L, 0L, 0L), P3 = c(1L, 0L, 1L, 1L), p265 = c(0L, 
1L, 1L, 0L)), row.names = c(NA, -4L), class = "data.frame")

We could use rowwise

library(dplyr)
library(stringr)
 df1  %>% 
  rowwise() %>%
  transmute(ID, TRA = sprintf("{%s}", 
    str_c(names(.)[-1][c_across(starts_with("P")) == 1], 
     collapse=", "))) %>% 
 ungroup

-output

# A tibble: 3 × 2
     ID TRA           
  <int> <chr>         
1     1 {P2, P3}      
2     2 {P1, P2, P265}
3     3 {P3, P265}    

Or using base R

cbind(df1['ID'], TRA = apply(df1[-1], 1, 
     \(x) sprintf("{%s}", toString(names(x)[x == 1]))))
  ID            TRA
1  1       {P2, P3}
2  2 {P1, P2, P265}
3  3     {P3, P265}

data

df1 <- structure(list(ID = 1:3, P1 = c(0L, 1L, 0L), P2 = c(1L, 1L, 0L
), P3 = c(1L, 0L, 1L), P265 = c(0L, 1L, 1L)),
class = "data.frame", row.names = c(NA, 
-3L))
Related