dplyr - 使用列名中的字段集创建新列

dplyr - creating new column with field set from column name

我有一个相当混乱的数据框,列名类似于
colnames(df) <- c("X1", "X2", "X3", "Y1", "Y2", "Y3")
我想更长时间地创建一个包含三列的数据框,使用 pivot_longer,其中 X 和 Y 各有一列,第三列(称为“运行”)包含 1 ,2 或 3 取决于上面的列名。 Pivot_longer 似乎是要使用的函数,但我不确定如何使用它来动态创建 2 个名为 X 和 Y 的列,取自列名,并从列名中提取第三列的值还。 有人知道怎么做吗?值得注意的是,实际的 df 有许多不同的列名,因此不可能强制命名新列。 感谢您的帮助!

您可以使用 pivot_longernames_pattern 中指定正则表达式。

df <- data.frame(X1 = rnorm(5), X2 = rnorm(5), Y1 = rnorm(5), Y2 = rnorm(5))

tidyr::pivot_longer(df, 
                    everything(), 
                    names_to = c('.value', 'run'), 
                    names_pattern = '([A-Z])(\d+)')

#   run        X       Y
#   <chr>    <dbl>   <dbl>
# 1 1      0.376   -1.73  
# 2 2     -0.497    1.24  
# 3 1      0.310   -2.20  
# 4 2      0.0114   0.783 
# 5 1      0.00501  0.543 
# 6 2      0.00986  0.0481
# 7 1     -0.0376   0.0214
# 8 2      0.678   -1.48  
# 9 1      0.724    0.163 
#10 2      1.03     0.436 

另一种选择是names_sep

library(dplyr)
library(tidyr)
df %>%
  pivot_longer(cols = everything(), names_to = c(".value", "run"),
          names_sep = "(?<=[A-Z])(?=\d)")



# A tibble: 10 x 3
#   run        X      Y
#   <chr>  <dbl>  <dbl>
# 1 1      0.654  1.58 
# 2 2     -0.115 -0.858
# 3 1     -0.162  0.581
# 4 2      0.667  0.242
# 5 1      0.905 -0.385
# 6 2     -0.787  1.01 
# 7 1     -1.68   0.171
# 8 2      0.264  0.420
# 9 1     -0.131 -0.405
#10 2     -1.15  -0.417

数据

df <- data.frame(X1 = rnorm(5), X2 = rnorm(5), Y1 = rnorm(5), Y2 = rnorm(5))