我有一个Dataframe,看起来大致像这样:
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
我想要基于VAR1a
,VAR1b
和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
,VAR2b
和VAR2c
与VAR1a
,VAR1b
和VAR1c
直接相关(因此,变量数后面的字母表示关联)。例如,VAR2a
是Main
赋给VAR1a
的值,以此类推。
理想情况下,我希望有这样的东西:
# 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做到这一点。
您可以尝试将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