【问题标题】:pivot_longer with groups of columns [duplicate]带有列组的 pivot_longer [重复]
【发布时间】:2020-02-20 10:31:49
【问题描述】:

我有一个如下所示的数据集:

df_start <- tribble(
    ~name,   ~age, ~x1_sn_ctrl1, ~x1_listing2_2, ~x1_affect1, ~x2_sn_ctrl1, ~x1_listing2_2, ~x2_affect1, ~number,
    "John",   28,        1,            1,             9,           4,            5,                9,       6,
    "Paul",   27,        2,            1,             4,           1,            3,                3,       4,
    "Ringo",  31,        3,            1,             2,           2,            5,                8,       9)

在处理我的列中的分组时,我需要pivot_longer()

  • 有 2 个 x 值(1 和 2)
  • 每个 x 值有 3 个问题(sn_ctrl1、listing2_2、affect1)

在我的实际数据集中,有 14 个 x。

基本上,我想做的是将pivot_longer() 应用于 x 值,但保留我的 3 个问题(sn_ctrl1、listing2_2、affect1)。

我想结束的是:

df_end <- tribble(
    ~name, ~age, ~xval, ~sn_ctrl1, ~listing2_2, ~affect1, ~number,
    "John", 28,    1,        1,         1,          9,       6,
    "John", 28,    2,        4,         5,          9,       6,
    "Paul", 27,    1,        2,         1,          4,       4,  
    "Paul", 27,    2,        1,         3,          3,       4, 
    "Ringo", 31,   1,        3,         1,          2,       9, 
    "Ringo", 31,   2,        2,         5,          8,       9)

我在names_patternpivot_longer 中尝试了很多 非常不成功的正则表达式,但我完全出局了。

有人知道如何解决这个问题吗?

谢谢!

PS:请注意,我试图制作一个简单的可重现示例。我的专栏的实际名称略有不同。比如x1_sn_ctrl1 & x1_attr1_ctrl2

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    你可以使用:

    tidyr::pivot_longer(df_start, 
                        cols = -c(name, age, number), 
                        names_to = c("xval", ".value"),
                        names_pattern = 'x(\\d+)_(.*)')
    

    产量

    # A tibble: 9 x 7
      name    age number xval  sn_ctrl1 listing2_2 affect1
      <chr> <dbl>  <dbl> <chr>    <dbl>      <dbl>   <dbl>
    1 John     28      6 1            1          1       9
    2 John     28      6 2            4         NA       9
    3 John     28      6 1           NA          5      NA
    4 Paul     27      4 1            2          1       4
    5 Paul     27      4 2            1         NA       3
    6 Paul     27      4 1           NA          3      NA
    7 Ringo    31      9 1            3          1       2
    8 Ringo    31      9 2            2         NA       8
    9 Ringo    31      9 1           NA          5      NA
    

    【讨论】:

    • 太棒了!非常感谢@Ronak!如此快速、聪明、乐于助人。
    • 我对上面df_start中的列名做了一点修改,以反映我的实际情况——列名的格式实际上是多种多样的(类似于上面的repro )。因为所有列的格式都不相同,所以您提供的 names_pattern 参数不起作用。我尝试将names_pattern 更改为names_sep = "_",我认为这会起作用,但似乎与names_to 参数中只有2 个参数没有交互。关于如何解决这个问题的任何建议?很抱歉让你双重工作。我试着先解决它!
    • @wscampbell 您可以使用tidyr::pivot_longer(df_start, cols = -c(name, age, number), names_to = c("xval", ".value"), names_pattern = 'x(\\d)_(.*)'),但由于列名重复,它会创建一个.copy 变量。也许问一个新问题?
    • 解决了!完美的!没有重复的列名,因此不会创建 .copy。你成功了!再次感谢@Ronak!
    • 我冒昧地更新了答案,以便它适用于问题的当前状态。干杯@RonakShah
    猜你喜欢
    • 1970-01-01
    • 2020-11-14
    • 2022-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-03
    • 1970-01-01
    相关资源
    最近更新 更多