首页 > 解决方案 > 基于多个变量创建长格式数据框

问题描述

我有一个大致如下所示的数据框:

my_data <- tribble(
  ~Main, ~VAR1a, ~VAR1b, ~VAR1c, ~VAR2a, ~VAR2b, ~VAR2c,
  "A", "B", "C", "D", 1, 1, 1,
  "B", "A", "D", "", 1, 2, NA,
  "C", "D", "A", "", 2, 1, NA
)
# A tibble: 3 x 7
  Main  VAR1a VAR1b VAR1c VAR2a VAR2b VAR2c
  <chr> <chr> <chr> <chr> <dbl> <dbl> <dbl>
1 A     B     C     "D"       1     1     1
2 B     A     D     ""        1     2    NA
3 C     D     A     ""        2     1    NA

我想根据 、 和 将这个数据框旋转更长VAR1aVAR1b时间VAR1c。这很容易做到:

my_data %>%
  pivot_longer(names_to = c("VAR1"),
               cols = c("VAR1a", "VAR1b", "VAR1c"))
# A tibble: 9 x 6
  Main  VAR2a VAR2b VAR2c VAR1  value
  <chr> <dbl> <dbl> <dbl> <chr> <chr>
1 A         1     1     1 VAR1a "B"  
2 A         1     1     1 VAR1b "C"  
3 A         1     1     1 VAR1c "D"  
4 B         1     2    NA VAR1a "A"  
5 B         1     2    NA VAR1b "D"  
6 B         1     2    NA VAR1c ""   
7 C         2     1    NA VAR1a "D"  
8 C         2     1    NA VAR1b "A"  
9 C         2     1    NA VAR1c ""  

然而,我的问题是,列VAR2a、和与、VAR2bVAR2c直接相关(因此,变量编号后的字母显示关联)。例如,是分配给的值等等。VAR1aVAR1bVAR1cVAR2aMainVAR1a

理想情况下,我希望有这样的东西:

# A tibble: 9 x 4
  Main  value VAR1   VAR2
  <chr> <chr> <chr> <dbl>
1 A     "B"   VAR1a     1
2 A     "C"   VAR1b     1
3 A     "D"   VAR1c     1
4 B     "A"   VAR1a     1
5 B     "D"   VAR1b     2
6 B     ""    VAR1c    NA
7 C     "D"   VAR1a     2
8 C     "A"   VAR1b     1
9 C     ""    VAR1c    NA

我不知道如何pivot_longer()使用 tidyverse 或是否可以使用 tidyverse。

标签: rdataframetidyverse

解决方案


你可以试试pivot_longer——

tidyr::pivot_longer(my_data, 
             cols = starts_with('VAR'), 
             names_to = '.value', 
             names_pattern = '(VAR\\d+)')

#  Main  VAR1   VAR2
#  <chr> <chr> <dbl>
#1 A     "B"       1
#2 A     "C"       1
#3 A     "D"       1
#4 B     "A"       1
#5 B     "D"       2
#6 B     ""       NA
#7 C     "D"       2
#8 C     "A"       1
#9 C     ""       NA

推荐阅读