如何在 R 中旋转成对的列?

How do I pivot pairs of columns in R?

我很难旋转成对的列。我知道有 names_pattern 论点,但我不知道如何进行这项工作。

我的数据是这样的:

structure(list(Q8_1_avg = 4.72562264837839, Q8_1_avg_se = 0.0595342202500642, 
               Q8_1_unweighted = 4.90473815461347, Q8_2_avg = 4.65508494735021, 
               Q8_2_avg_se = 0.0541589332376175, Q8_2_unweighted = 4.6498753117207, 
               Q8_3_avg = 5.4756060523178, Q8_3_avg_se = 0.0534895224170486, 
               Q8_3_unweighted = 5.57506234413965), row.names = c(NA, -1L
               ), class = "data.frame")->dat


我想要的输出如下所示:

df<-data.frame(
Question=c('Q8_1', 'Q8_2','Q8_3'),
#Values taken from Q8_[123]_avg
Weighted_Average=c(4.72,4.65, 5.47),
#Values taken from Q8_[123]_avg_se
Weighted_SE=c(0.05,0.05 ,0.05),
#Values taken from Q8_[123]_unweighted
Unweighted_Average=c(4.90, 4.64, 5.57)
)
df

感谢您的帮助。

我们可以使用pivot_longer。如果需要,请使用 rename 更改列名。将 names_to 指定为 'Question'(其中 return 列名称的前缀部分)和 .value return 长格式值的向量。然后,在 names_pattern 中,捕获前缀部分,即一个或多个不是 _ ([^_]+) 的字符,后跟 _ 和一些数字 (\d+) 作为一组 ((...)) 然后是 _ 和涉及其余字符的第二个捕获组 ((.*))

library(dplyr)
library(tidyr)
dat %>% 
   pivot_longer(cols = everything(), names_to = c("Question", 
       ".value"), names_pattern = "^([^_]+_\d+)_(.*)")
# A tibble: 3 × 4
  Question   avg avg_se unweighted
  <chr>    <dbl>  <dbl>      <dbl>
1 Q8_1      4.73 0.0595       4.90
2 Q8_2      4.66 0.0542       4.65
3 Q8_3      5.48 0.0535       5.58