我有一个看起来像这样的数据集:
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)
:
在我的实际数据集中,有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_pattern
和pivot_longer
。
答案 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