我有一个数据帧,其中包含:
userID song sex
1 songA M
2 songB F
1 songC M
2 songA F
... ... ...
因此,每一行都是用户所听歌曲的一个寄存器。我想使用"arules",但首先我需要将此数据帧转换为事务。我找了很多,但实际上我不知道我的想法是否错了,因为我还没有答案。我找到了一些解决方案,比如使用split创建列表,每个用户列出所有歌曲,但如果我这样做,我会丢失性别信息。我只会得到像{songA,songB} -> {songZ}
这样的规则。我想生成像{songA,songC,M} -> {songZ}
这样的规则(使用性别信息(。我不知道我的想法是否错了,这是不可能的。知道吗?
谢谢。
如果您正在研究关联,您通常希望将数据重新定义为一个长数据帧,其中包含一个ID列和另一个用于二进制项属性的列。
有很多方法可以重塑你的数据以获得正确的形式。在你的例子中,我使用tidyverse
进行了重塑,还添加了一个distinct,这样用户的性别就不会被多次陈述。
txt = "
userID song sex
1 songA M
2 songB F
1 songC M
2 songA F "
df <- read.table(text = txt, header = TRUE)
library(tidyverse)
df %>%
pivot_longer(cols = c(song, sex)) %>%
distinct()
#> # A tibble: 6 x 3
#> userID name value
#> <int> <chr> <fct>
#> 1 1 song songA
#> 2 1 sex M
#> 3 2 song songB
#> 4 2 sex F
#> 5 1 song songC
#> 6 2 song songA