【问题标题】:How do I pivot pairs of columns in R?如何在 R 中旋转成对的列?
【发布时间】:2021-10-07 18:31:19
【问题描述】:

我在旋转成对列时遇到困难。我知道有 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

感谢您的帮助。

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

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

    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
    

    【讨论】:

    • 好的,这太棒了。你能告诉我逻辑吗?特别是正则表达式!
    • @spindoctor 因为正则表达式总是让我受益,我想我会说我最近一直在使用交互式RegExplain,它使我的故障排除正则表达式更加简化。使用它我想出了names_pattern = "(\\w\\d_\\d)_(.*)"(在中断“”之前以特定模式获取字母、数字和“”)和names_pattern = "(.*_.)_(.*)"。这些在您的示例中有效,但如果您的真实姓名更多变,则可能会受到太多限制。
    猜你喜欢
    • 2022-01-23
    • 2020-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2014-03-30
    • 2022-11-15
    • 1970-01-01
    相关资源
    最近更新 更多