pivot_longer 组合列组:高级透视

wsc*_*ell 2 pivot r dplyr

需要:从宽到长旋转,堆叠相应列的组。
本质上,我有 3 组 5 列,需要将每个相应的列堆叠为 1(即,3 组中每组中的第一个变量变为 1 列,每组中的第二个变量是第 2 列, 等等)。例如,我需要:第 2、7 和 12 列都在 1 列中,第 3、8 和 13 列在下一列中,...... 6、11 和 16 列都在 1 列中。

数据结构:我有一个类似于这样的数据集:

df <- tibble(
  pid = c(1, 2, 3, 4),
  
  v1_1 = c(19, NA, NA, NA),
  v1_2 = c(12, NA, NA, NA),
  v2_1 = c(15, NA, NA, NA),
  v2_2 = c(19, NA, NA, NA),
  v1_entry_3 = c(11, NA, NA, NA),
  
  v1_1_1 = c(NA, NA, 36, NA),
  v1_2_1 = c(NA, NA, 35, NA),
  v2_1_1 = c(NA, NA, 31, NA),
  v2_2_1 = c(NA, NA, 39, NA),
  v1_entry_3_1 = c(NA, NA, 33, NA),
  
  v1_1_2 = c(NA, 26, NA, 41),
  v1_2_2 = c(NA, 29, NA, 44),
  v2_1_2 = c(NA, 21, NA, 42),
  v2_2_2 = c(NA, 20, NA, 45),
  v1_entry_3_2 = c(NA, 22, NA, 44),
  
  age = c(19, 21, 33, 47)
)
Run Code Online (Sandbox Code Playgroud)

最后,我需要如下所示的数据:

df_t <- tibble(
  pid = c(1, 2, 3, 4),
  
  v1_1 = c(19, 26, 36, 41),
  v1_2 = c(12, 29, 35, 44),
  v2_1 = c(15, 21, 31, 42),
  v2_2 = c(19, 20, 39, 45),
  v1_entry_3 = c(11, 22, 33, 44),
  
  age = c(19, 21, 33, 47)
)
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

考虑在执行之前重命名一些列 pivot_longer

library(dplyr)
library(stringr)
library(tidyr)
df %>% 
  rename_with(~ str_c(., '_0'), matches("^v\\d+_\\d+$|^v\\d+_entry_\\d+$")) %>% 
    pivot_longer(cols = -c(pid, age), names_to = c(".value"), 
        names_pattern = "(.*)_\\d+$", values_drop_na = TRUE)
# A tibble: 4 x 7
    pid   age  v1_1  v1_2  v2_1  v2_2 v1_entry_3
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>      <dbl>
1     1    19    19    12    15    19         11
2     2    21    26    29    21    20         22
3     3    33    36    35    31    39         33
4     4    47    41    44    42    45         44
Run Code Online (Sandbox Code Playgroud)


H 1*_*H 1 5

您需要在第二个下划线之前的所有内容上匹配列名:

library(tidyr)

df %>%
  pivot_longer(
    -c(pid, age),
    names_pattern =  "([^_]*_[^_]*)",
    names_to = ".value",
    values_drop_na = TRUE
  )

# A tibble: 4 x 7
    pid   age  v1_1  v1_2  v2_1  v2_2 v1_entry
  <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>    <dbl>
1     1    19    19    12    15    19       11
2     2    21    26    29    21    20       22
3     3    33    36    35    31    39       33
4     4    47    41    44    42    45       44
Run Code Online (Sandbox Code Playgroud)