R:更改pivot_wider() 中的列名——前缀的后缀

mkp*_*pcr 5 r reshape tidyr data-wrangling

我试图弄清楚如何改变 tidyrpivot_wider()函数在生成的宽数据集中创建新变量名称的方式。具体来说,我希望将“names_from”变量添加到新变量的前缀而不是后缀。

我的数据集看起来像:

list(ID = c("A950", "A950", "A950", "A970", "A970", "A970", "A996", "A996", "A996"), 
Phase = c("P1", "P2", "P3", "P1", "P2", "P3", "P1", "P2", "P3"), 
A = c(23.5, 25.2, 21.9, 21.9, 21.1, 20.3, 19.5, 18.7, 17.9), 
B = c(21.9, 21.1, 20.3, 19.5, 18.7, 17.9, 17.1, 16.3, 15.5), 
C = c(25.2, 21.9, 20.3, 17.6, 15.1, 12.7, 10.3, 7.8, 5.4), 
D = c("M", "M", "M", "F", "F", "F", "N", "N", "N"))
Run Code Online (Sandbox Code Playgroud)

当我使用pivot_wider()Phase 作为“关键”来传播数据集时,我的结果如下所示:

ex_wide <- ex_long %>%
  pivot_wider(names_from = Phase, values_from = c(3:6))

list(ID = c("A950", "A970", "A996"), 
A_P1 = c(23.5, 21.9, 19.5), 
A_P2 = c(25.2, 21.1, 18.7), 
A_P3 = c(21.9, 20.3, 17.9), 
B_P1 = c(21.9, 19.5, 17.1), 
B_P2 = c(21.1, 18.7, 16.3), 
B_P3 = c(20.3, 17.9, 15.5), 
C_P1 = c(25.2, 17.6, 10.3), 
C_P2 = c(21.9, 15.1, 7.8), 
C_P3 = c(20.3, 12.7, 5.4), 
D_P1 = c("M", "F", "N"), 
D_P2 = c("M", "F", "N"), 
D_P3 = c("M", "F", "N"))
Run Code Online (Sandbox Code Playgroud)

我希望列名看起来像P1_A而不是A_P1(即,phase_variable 而不是 variable_phase)。

这似乎很容易弄清楚;但是,我一直无法找到适合我需求的任何解决方案。任何帮助将不胜感激。提前致谢。

小智 7

您可以names_glue为此使用参数:

ex_wide <- ex_long %>%
  pivot_wider(names_from = Phase, values_from = c(3:6), names_glue = "{Phase}_{.value}")
Run Code Online (Sandbox Code Playgroud)

您只需使用分隔符传递Phase名称和.value指定列_

结果

ex_wide <- ex_long %>%
  pivot_wider(names_from = Phase, values_from = c(3:6), names_glue = "{Phase}_{.value}")
Run Code Online (Sandbox Code Playgroud)

数据

ex_long <- structure(list(ID = c("A950", "A950", "A950", "A970", "A970", 
"A970", "A996", "A996", "A996"), Phase = c("P1", "P2", "P3", 
"P1", "P2", "P3", "P1", "P2", "P3"), A = c(23.5, 25.2, 21.9, 
21.9, 21.1, 20.3, 19.5, 18.7, 17.9), B = c(21.9, 21.1, 20.3, 
19.5, 18.7, 17.9, 17.1, 16.3, 15.5), C = c(25.2, 21.9, 20.3, 
17.6, 15.1, 12.7, 10.3, 7.8, 5.4), D = c("M", "M", "M", "F", 
"F", "F", "N", "N", "N")), class = "data.frame", row.names = c(NA, 
-9L))
Run Code Online (Sandbox Code Playgroud)