【问题标题】:How to reshape multiple rows to a single row with several columns如何将多行重塑为具有多列的单行
【发布时间】:2013-03-31 18:01:56
【问题描述】:

对于已经使用 reshape 包的人来说,这似乎是一个显而易见的问题,但我正在尝试使用它的功能,但我无法找出正确的语法!

让我们有以下数据框,

df <- data.frame(matrix(1:12,ncol=3),row.names=letters[1:4])

  X1 X2 X3
a  1  5  9
b  2  6 10
c  3  7 11
d  4  8 12

我们如何将行绑定到列中以获得以下结果?

  X1.a X2.a X3.a X1.b X2.b X3.b X1.c X2.c X3.c X1.d X2.d X3.d
     1    5    9    2    6   10    3    7   11    4    8   12

谢谢

【问题讨论】:

    标签: r dataframe reshape


    【解决方案1】:

    这也可以:

    vec <- c(t(df))
    names(vec) <- c(outer(colnames(df), rownames(df), paste, sep="."))
    
    ## > vec
    ## X1.a X2.a X3.a X1.b X2.b X3.b X1.c X2.c X3.c X1.d X2.d X3.d 
    ##    1    5    9    2    6   10    3    7   11    4    8   12 
    

    【讨论】:

    • 啊……!!!!当我有expand.grid 的解决方案时,我应该想到outer。非常好! (+1) 来自我。
    【解决方案2】:

    由于您希望将其作为矢量,因此不需要 reshape perse。您可以只 unlist 它,然后使用 setNames 相应地设置名称。

    df.t <- as.data.frame(t(df))
    vec <- unlist(df.t, use.names=FALSE) # gives a vector not matrix/data.frame
    vec.names <- do.call(paste, c(expand.grid(rownames(df.t), colnames(df.t)), sep="."))
    vec <- setNames(vec, vec.names)
    
    # X1.a X2.a X3.a X1.b X2.b X3.b X1.c X2.c X3.c X1.d X2.d X3.d 
    #    1    5    9    2    6   10    3    7   11    4    8   12 
    

    【讨论】:

      【解决方案3】:

      这是一个:

      m <- melt(cbind(df, rn=rownames(df)), id.vars='rn')
      cast(m, ~ rn + variable)
      
      ##   value a_X1 a_X2 a_X3 b_X1 b_X2 b_X3 c_X1 c_X2 c_X3 d_X1 d_X2 d_X3
      ## 1 (all)    1    5    9    2    6   10    3    7   11    4    8   12
      

      或者正如 Arun 所指出的,acast 给出了一个矩阵(没有额外的 value 列):

      acast(m, . ~ variable+rn)
      ##      X1_a X1_b X1_c X1_d X2_a X2_b X2_c X2_d X3_a X3_b X3_c X3_d
      ## [1,]    1    2    3    4    5    6    7    8    9   10   11   12
      

      (请注意,由于公式被翻转,排列顺序相反。)

      【讨论】:

      • 我会使用 reshape2acast(m, . ~ variable + rn)
      • 有话要说,@Arun。
      • 对不起,我不太明白你的意思:)。
      • 你可以通过acast(m, . ~rn+variable)翻转结果
      • @Emer 我相信我在上面写过。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-16
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2020-10-16
      相关资源
      最近更新 更多