【问题标题】:How do I learn the grouping function with pivot_longer and names_pattern如何使用 pivot_longer 和 names_pattern 学习分组功能
【发布时间】:2023-12-28 06:56:02
【问题描述】:

我正在尝试处理pivot_longer 中的names_pattern 参数,但我不确定我是否了解分组功能及其工作原理。我需要旋转以下数据框以匹配下面所需的输出。

df<-structure(list(Weighted_Ideology =0.514, Weighted_Ideology_se = 0.00, Unweighted_Ideology = 0.51, Unweighted_Ideology_se = 0.004), row.names = c(NA, -1L), class = "data.frame")

library(tidyr)
df%>%
pivot_longer(., cols=everything(), names_to=c('Variable',  ".value"), names_pattern="([a-z]+_[a-z]+)_(.*)")

期望的输出

df2<-data.frame(
  Variable=c('Weighted', "Unweighted"),
  Ideology=c(0.54, 0.51),
  se=c(0.005, 0.004)
)

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    更改names_pattern 以从列名的开头(^) 捕获不是_ 的字符作为一个组,跟随_,然后捕获其余字符( (.*))

    library(dplyr)
    library(tidyr)
    df %>%
        pivot_longer(cols = everything(), names_to = c("Variable", ".value"), 
           names_pattern = "^([^_]+)_(.*)")%>%
        rename(se = Ideology_se)
    

    -输出

    # A tibble: 2 × 3
      Variable   Ideology    se
      <chr>         <dbl> <dbl>
    1 Weighted      0.514 0    
    2 Unweighted    0.51  0.004
    

    [a-z]+ 仅表示小写字符,而在列名中,有大写起始字符 (Weighted_Ideology)。当有多个_ 并且我们想在特定的_ 处进行拆分时,最好匹配除_ ([^_]+) 以外的字符,如上述解决方案中所示

    【讨论】: