如何在 R 中编辑 pivot_wider 中的迭代顺序

How can I edit the iteration order in pivot_wider in R

我将 df 转换为宽格式 (df_wide),指定在创建新列时,df'moderator_cat' 列的名称应该放在第一位df_wide 数据框上的名称。

# create df
df <- data.frame(LIWC_name=c('rc_WC', 'rc_WC', 'rc_WC', 'rc_WC'),
                   OCEAN = c('O', 'O', 'E', 'E'),
                   moderator_cat = c('version', 'sample', 'version', 'sample'),
                   group1 = c(-.02, -.12, .34, .04),
                   group2 = c(-.13, .001, .12, .08),
                   group3 = c(NA, -.09, NA, .33))

# create wide version of df
df_wide <- pivot_wider(
  data = df,
  names_from = moderator_cat,
  names_sep = "_",
  values_from = c("group1":"group3"),
  names_glue = "{moderator_cat}_{.value}"
)

到目前为止一切正常,但我希望 df_wide 中的列首先遍历所有 'groups'(即 'version_group1'、'version_group2'、'version_group3'),然后对 'sample' 变量(即 'sample_group1'、'sample_group2'、'sample_group3')执行相同的操作,而不是现在的顺序(version_group1、sample_group1、version_group2、sample_group2 等)。有办法吗?

我们可以使用str_sort

library(dplyr)
library(stringr)
df_wide %>%
   select(LIWC_name, OCEAN, str_sort(names(.)[-(1:2)], numeric = TRUE))

或者另一种选择是 select-helpers

df_wide %>%
  select(LIWC_name, OCEAN, starts_with('version'), starts_with('sample'))

-输出

# A tibble: 2 x 8
#  LIWC_name OCEAN version_group1 version_group2 version_group3 sample_group1 sample_group2 sample_group3
#  <chr>     <chr>          <dbl>          <dbl>          <dbl>         <dbl>         <dbl>         <dbl>
#1 rc_WC     O              -0.02          -0.13             NA         -0.12         0.001         -0.09
#2 rc_WC     E               0.34           0.12             NA          0.04         0.08           0.33