R 用存根将宽变长

问题描述 投票:0回答:1
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,但其中一些是相似的...

r data.table
1个回答
0
投票

一种选择是使用

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
© www.soinside.com 2019 - 2024. All rights reserved.