如何在 R 中将数据转换为事务格式

How to convert data into transactional format in R

我有以下数据集,我想将其转换为交易格式。

sample_data<-data.frame(id=c(452,125,288,496,785,328,712,647),a=c(5,8,7,9,0,0,4,0),b=c(0,7,8,9,3,6,0,0),c=c(7,8,9,0,0,0,0,7),d=c(8,7,5,0,0,0,0,7))
sample_data

sample_data
id  a b c d
452 5 0 7 8
125 8 7 8 7
288 7 8 9 5
496 9 9 0 0
785 0 3 0 0
328 0 6 0 0
712 4 0 0 0
647 0 0 7 7

期望的输出如下:

id      item
452     a c d
125     a b c d
288     a b c d
496     a b
785     b
328     b
712     a
647     c d

如何在 R 中实现这一点?

有更简单的方法吗?

我们可以用apply遍历行,得到数值列的值不为0的数据的names,和paste在一起,然后cbind 与数据的第一列

cbind(sample_data[1], item = apply(sample_data[-1], 1, 
      function(x) paste(names(x)[x != 0], collapse = ' ')))

-输出

#   id    item
#1 452   a c d
#2 125 a b c d
#3 288 a b c d
#4 496     a b
#5 785       b
#6 328       b
#7 712       a
#8 647     c d

这是使用 pivot_longerfiltersummarizetidyverse 解决方案。

library(dplyr)
library(stringr)
library(tidyr)

sample_data %>%
  pivot_longer(a:d, names_to = "item") %>%
  filter(value != 0) %>%
  group_by(id) %>%
  summarize(item = str_c(item, collapse = " "))

# A tibble: 8 x 2
     id item   
  <dbl> <chr>  
1   125 a b c d
2   288 a b c d
3   328 b      
4   452 a c d  
5   496 a b    
6   647 c d    
7   712 a      
8   785 b