重塑Dataframe,使Group的值为列

时间:2017-03-21 14:45:45

标签: r associations apriori

我有一个数据框:

Partner    Col1    Col2    Col3     Col4    Col5    
      A      ab      ac      ad       ed
      B      ol      le
      C      ef
      E      ab      ol      ef       at      ok

我想将其转换为:

arules

对于某些上下文,我将使用apriori包将我的数据帧转换为事务类以调用read.transactions算法。

我想要这样做的方法是转换原始数据帧。将其另存为单独的文件,然后使用$font_f再次调用它。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

你会想要使用dcast。如果您有一个大型数据集,请在data.table中查看dcast。否则,reshape2中的那个将正常工作。

library(reshape2)
df2 = dcast(df,  Partner ~ Item, value.var = "Item")

这会给我们

  Partner   ab   ac   ad   at   ed   ef   le   ok   ol
1       A   ab   ac   ad <NA>   ed <NA> <NA> <NA> <NA>
2       B <NA> <NA> <NA> <NA> <NA> <NA>   le <NA>   ol
3       C <NA> <NA> <NA> <NA> <NA>   ef <NA> <NA> <NA>
4       E   ab <NA> <NA>   at <NA>   ef <NA>   ok   ol

然后,我们只需要设置列名并用“”

填写NA
colnames = paste("Col",1:length(unique(df$Item)), sep = "")
colnames(df2) = c("Partner",paste("Col",1:length(unique(df$Item)), sep = ""))
df2[is.na(df2)] <- ""

  Partner Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
1       A   ab   ac   ad        ed                    
2       B                                 le        ol
3       C                            ef               
4       E   ab             at        ef        ok   ol

要排序你可以做这样的事情

tmp = df2[, 2:ncol(df2)]
tmp = t(apply(tmp, 1, sort, decreasing = TRUE))

df3 = cbind.data.frame(df2[,1],tmp)
colnames(df3) = c("Partner",paste("Col",1:length(unique(df$Item)), sep = ""))

> df3

  Partner Col1 Col2 Col3 Col4 Col5 Col6 Col7 Col8 Col9
1       A   ed   ad   ac   ab                         
2       B   ol   le                                   
3       C   ef                                        
4       E   ol   ok   ef   at   ab      

可能有更有效的方法。 Apply将DF转换为矩阵进行排序。我不知道如何在不使用它的情况下这样做。