带列组的pivot_longer

时间:2020-02-20 10:31:49

标签: r dplyr

我有一个看起来像这样的数据集:

Status

在处理我的列中的分组时,我需要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)

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

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

本质上,我想做的是将pivot_longer()应用于x值,但将我的3个问题(sn_ctrl1,listing2_2,ffect1)保留得较宽。

我想结束的是:

pivot_longer()

我在<{1}}和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) 中尝试了很多次非常不成功的正则表达式尝试,但完全被淘汰。

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

谢谢!

PS:请注意,我试图举一个简单易懂的示例。我的列的实际名称略有不同。例如,有names_patternpivot_longer

1 个答案:

答案 0 :(得分:5)

您可以使用:

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

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