【问题标题】:Reshaping multicolumn dataframe into single row with dplyr使用 dplyr 将多列数据框重塑为单行
【发布时间】:2018-03-20 09:24:16
【问题描述】:

我有一个像这样的数据框

name value1 value2 value3
X      1 .    2 .   6
Y      2 .    5 .   7

有没有办法使用 dplyr 将其变成单行数据框?

x_value1 x_value2 x_value3 y_value1 y_value2 y_value3

我尝试使用 spread 但它抱怨 value1 到 value3 的多个列。

谢谢 c

【问题讨论】:

    标签: r dplyr reshape


    【解决方案1】:

    我们可以通过 gathering 到 'long' 格式,unite 'name','key' 列然后执行 spread 来做到这一点

    library(tidyverse)
    gather(df1, key, value, -name) %>%
        unite(namekey, name, key) %>% 
        spread(namekey, value)
    #   X_value1 X_value2 X_value3 Y_value1 Y_value2 Y_value3
    #1        1        2        6        2        5        7
    

    【讨论】:

    • 嗨@akrun,谢谢!这可能是一个愚蠢的问题,但你能告诉我在我的情况下键和值列是什么。在收集函数中?
    • @clog14 gather 通过指定 'key'、'value' 将列从 'wide' 转换为 'long',列名进入 'key' 列,值进入“价值”列。只是我用了'key/value你可以创建成a/b或者a1/b1等等。
    【解决方案2】:

    由于data.frame 只是一个列表列表,因此您不需要任何花哨的东西来执行此操作。普通的旧连接函数c 可以为您完成。直接调用c 是行不通的,因为这只会返回数据框,但do.call 会将参数列表拼接成实际参数,所以do.call(c(df)) 会做你想做的事。

    > df <- data.frame(x = rnorm(3), y = rnorm(3), z = rnorm(3))
    > df
                x         y          z
    1 -0.02600453 1.5596611  0.1419269
    2  0.61540806 1.0944946  0.7526085
    3 -0.79033738 0.1369467 -0.1867725
    > do.call(c, df)
             x1          x2          x3          y1          y2 
    -0.02600453  0.61540806 -0.79033738  1.55966113  1.09449457 
             y3          z1          z2          z3 
     0.13694672  0.14192691  0.75260853 -0.18677246 
    

    如果你绝对想要使用dplyr,那么我想你可以这样做

    df %>% do.call(c, .)
    

    ;)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-05
      • 2018-04-24
      • 1970-01-01
      • 2016-02-14
      • 2016-12-05
      • 2012-07-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多