【问题标题】:How to spread rows to columns by grouping and filtering?如何通过分组和过滤将行扩展到列?
【发布时间】:2019-11-28 13:59:42
【问题描述】:

我有一个类似这样的数据集:

df_1 <- tribble(
  ~id,       ~type,     ~min_price,  ~max_price,
  "1",        "X",          10,          40,
  "1",        "Y",          20,          50,
  "2",        "X",          18,          40,
  "2",        "Y",          34,          50,
  "2",         NA,          15,          70,
  "3",        "X",          40,          90,
  "3",        "Y",          23,         100,
)

但现在,我想按“id”对数据进行分组,然后将行切换为列。我认为这不像转置。

df_1 <- tribble(
  ~id,      ~min_price_X, ~min_price_Y,  ~min_price_NA,  ~max_price_X, ~max_price_Y,  ~max_price_NA,
  "1",           10,           10,             NA,             40,           50,            NA,      
  "2",           18,           34,             15,             40,           50,            70,
  "3",           40,           23,             NA,             90,          100,            NA, 
)

您对获取这些数据有什么建议吗?

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我们可以使用pivot_wider,它可以包含多个values 列。

    tidyr::pivot_wider(df_1, names_from = type, values_from = c(min_price, max_price))
    
    # A tibble: 3 x 7
    #  id    min_price_X min_price_Y min_price_NA max_price_X max_price_Y max_price_NA
    #  <chr>       <dbl>       <dbl>        <dbl>       <dbl>       <dbl>        <dbl>
    #1 1              10          20           NA          40          50           NA
    #2 2              18          34           15          40          50           70
    #3 3              40          23           NA          90         100           NA
    

    【讨论】:

      【解决方案2】:

      你可以试试这个:

      library("reshape2")
      dcast(melt(df_1, id.vars = c("id", "type")), id ~ variable + type)
      

      结果是:

        id min_price_X min_price_Y min_price_NA max_price_X max_price_Y max_price_NA
      1  1          10          20           NA          40          50           NA
      2  2          18          34           15          40          50           70
      3  3          40          23           NA          90         100           NA
      

      【讨论】:

        猜你喜欢
        • 2021-05-07
        • 2016-07-03
        • 1970-01-01
        • 1970-01-01
        • 2023-03-14
        • 2021-10-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多