HAVE = data.frame(STUDENT=c(1,2),
CLASS = c(100,200),
T1CHE=c(95,NA),
T2CHE=c(13,66),
T3CHE=c(99,1),
T1CHES=c(81,NA),
T2CHES=c(43,59),
T3CHES=c(3,25),
P11MATH=c(56,88),
P12MATH=c(33,40),
P5MATHS=c(100,31),
P6MATHS=c(88,36),
T2ENG=c(37,63),
T3ENG=c(46,38),
T4ENG=c(14,74))
WANT = data.frame(STUDENT=c(1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2),
CLASS = c(100,100,100,100,100,100,100,100,200,200,200,200,200,200,200,200),
TIME=c(1,2,3,4,5,6,11,12,1,2,3,4,5,6,11,12),
CHE=c(95,13,99,NA,NA,NA,NA,NA,NA,66,1,NA,NA,NA,NA,NA),
CHES=c(81,43,3,NA,NA,NA,NA,NA,NA,59,25,NA,NA,NA,NA,NA),
MATH=c(NA,NA,NA,NA,NA,NA,56,33,NA,NA,NA,NA,NA,NA,88,40),
MATHS=c(NA,NA,NA,NA,100,88,NA,NA,NA,NA,NA,NA,31,36,NA,NA),
ENG=c(NA,37,46,14,NA,NA,NA,NA,NA,63,38,74,NA,NA,NA,NA))
我在“HAVE”中使用 STUBS 反复测量了一堆变量。我希望将宽“HAVE”转换为长“WANT”,而不必指定所有 STUBS,但其中一些是相似的...
一种选择是使用
pivot_longer
包中的 separate_wider_regex
、pivot_wider
和 tidyr
,如下所示:
注意:您的示例包含重复的列名称。结果我们最终得到
MATH
和 MATH.1
。
library(tidyr)
HAVE |>
pivot_longer(-c(STUDENT, CLASS)) |>
separate_wider_regex(
name,
patterns = c("P|T", TIME = "\\d+", variable = ".*")
) |>
pivot_wider(
names_from = "variable",
values_from = "value"
)
#> # A tibble: 16 × 9
#> STUDENT CLASS TIME CHE CHES MATH MATH.1 MATHS ENG
#> <dbl> <dbl> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 1 100 1 95 81 NA NA NA NA
#> 2 1 100 2 13 43 NA NA NA 37
#> 3 1 100 3 99 3 NA NA NA 46
#> 4 1 100 11 NA NA 56 NA NA NA
#> 5 1 100 12 NA NA 33 70 NA NA
#> 6 1 100 5 NA NA NA NA 100 NA
#> 7 1 100 6 NA NA NA NA 88 NA
#> 8 1 100 4 NA NA NA NA NA 14
#> 9 2 200 1 NA NA NA NA NA NA
#> 10 2 200 2 66 59 NA NA NA 63
#> 11 2 200 3 1 25 NA NA NA 38
#> 12 2 200 11 NA NA 88 NA NA NA
#> 13 2 200 12 NA NA 40 89 NA NA
#> 14 2 200 5 NA NA NA NA 31 NA
#> 15 2 200 6 NA NA NA NA 36 NA
#> 16 2 200 4 NA NA NA NA NA 74