【问题标题】:Reshape Dataframe to have values by Group be columns [duplicate]重塑数据框以按组将值设为列[重复]
【发布时间】:2017-03-21 14:45:44
【问题描述】:

我有一个这样的数据框:

Partner    Item
      A      ab
      A      ac
      A      ad
      A      ed
      B      ol
      B      le
      C      ef
      E      ab
      E      ol
      E      ef
      E      at
      E      ok

我想把它转换成:

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 再次调用它。

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

【问题讨论】:

    标签: r associations apriori


    【解决方案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
    

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

    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 转换为矩阵进行排序。不过,我不确定如何在不使用它的情况下执行此操作。

    【讨论】:

    • 这很棒@Kristofersen。您将如何对其进行排序,以便所有内容从左到右读取,而不是在左侧有空格?所以最终输出看起来像我的最终输出
    • @NickKnauer 我添加了一种排序方法。可能有更好的方法,但这是我能想到的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 2019-09-09
    • 1970-01-01
    • 2020-06-05
    • 2019-05-29
    相关资源
    最近更新 更多