Lar*_*ury 2 transpose pivot r tidyr tidyverse
我有 12 列,其中包含 12 个测试的信息,每个测试都有三个不同的分数(bl、ind、dup),并且我有五个测试类别/类型matches('fluen|acur|dlp|outc|nota')。我试图将更长的它们分为五列'fluen'、dlp、'acur'、'ouct'、'nota',其中将包含每个测试的测试分数/值和一个名为type的分类列,其中包含测试名称避免硬编码的因素(bl、ind、dup)。
head(my_data)
ID blfluen indfluen dupfluen blacur indacur dupacur bldlp inddlp dupdlp blnota indnota dupnota
1 p1 77.58 97.37 102.10 5.33 5.05 5.15 69.33 52.42 60.20 7 6.0 6.0
2 p2 93.63 81.56 97.84 5.82 2.29 7.54 50.09 57.93 56.79 9 7.5 8.0
Run Code Online (Sandbox Code Playgroud)
ID fluen dlp acur outc nota type
part1 bl
part1 ind
part1 dup
part2 bl
part2 ind
part2 dup
so on...
Run Code Online (Sandbox Code Playgroud)
问题:我怎样才能达到所需的输出pivot_longer()?我确信有一种方法可以立即做到这一点,避免硬编码。我见过类似的问题,但吸引我的是模式名称,我不知道如何将其分组为单个正则表达式,例如......提前致谢!
可重现的数据:
> dput(head(my_data))
structure(list(ID = c("p1", "p2", "p3", "p4", "p5", "p6"), blfluen = c(77.58,
93.63, 96, 59.74, 107.83, 90), indfluen = c(97.37, 81.56, 103.94,
82.1, 100.31, 90.47), dupfluen = c(102.1, 97.84, 113.04, 93.87,
96.36, 94.13), blacur = c(5.33, 5.82, 4.46, 8.97, 6.76, 3.33),
indacur = c(5.05, 2.29, 2.43, 7.69, 8.41, 11.57), dupacur = c(5.15,
7.54, 1.53, 7.21, 3.77, 7.69), bldlp = c(69.33, 50.09, 55.71,
59.74, 60.6, 65.55), inddlp = c(52.42, 57.93, 55.77, 61.02,
54.57, 66.31), dupdlp = c(60.2, 56.79, 46.15, 63.29, 65.28,
56.26), blnota = c(7, 9, 8, 4, 9, 7), indnota = c(6, 7.5,
8, 5, 9, 7), dupnota = c(6, 8, 9, 6, 8.5, 7.5)), row.names = c(NA,
6L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)
使用names_pattern参数和特殊.value你可以做:
library(tidyr)\n\nmy_data |> \n pivot_longer(-ID, names_to = c("type", ".value"), names_pattern = "^(bl|ind|dup)(.*)$")\n#> # A tibble: 18 \xc3\x97 6\n#> ID type fluen acur dlp nota\n#> <chr> <chr> <dbl> <dbl> <dbl> <dbl>\n#> 1 p1 bl 77.6 5.33 69.3 7 \n#> 2 p1 ind 97.4 5.05 52.4 6 \n#> 3 p1 dup 102. 5.15 60.2 6 \n#> 4 p2 bl 93.6 5.82 50.1 9 \n#> 5 p2 ind 81.6 2.29 57.9 7.5\n#> 6 p2 dup 97.8 7.54 56.8 8 \n#> 7 p3 bl 96 4.46 55.7 8 \n#> 8 p3 ind 104. 2.43 55.8 8 \n#> 9 p3 dup 113. 1.53 46.2 9 \n#> 10 p4 bl 59.7 8.97 59.7 4 \n#> 11 p4 ind 82.1 7.69 61.0 5 \n#> 12 p4 dup 93.9 7.21 63.3 6 \n#> 13 p5 bl 108. 6.76 60.6 9 \n#> 14 p5 ind 100. 8.41 54.6 9 \n#> 15 p5 dup 96.4 3.77 65.3 8.5\n#> 16 p6 bl 90 3.33 65.6 7 \n#> 17 p6 ind 90.5 11.6 66.3 7 \n#> 18 p6 dup 94.1 7.69 56.3 7.5\nRun Code Online (Sandbox Code Playgroud)\n