r - 一次旋转更长的十二列

标签 r pivot tidyverse tidyr transpose

我有 12 列包含 12 个测试的信息,每个测试有三个不同的分数 (bl, ind, dup) 我有五个测试类别/类型 matches('fluen|acur |dlp|outc|nota')。我正在尝试将它们分成五列 'fluen', dlp, 'acur' , 'ouct', 'nota' ,其中将包含每个测试的测试分数/值和一个分类列称为类型,包含测试名称作为因素(bl、ind、dup)avoiding hard-coding .

  • 数据:
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
  • 期望的输出:
ID      fluen dlp acur outc nota type

part1                            bl
part1                            ind
part1                            dup
part2                            bl
part2                            ind
part2                            dup

so on...
  • 问题:如何使用 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")

最佳答案

使用 names_pattern 参数和特殊的 .value 你可以:

library(tidyr)

my_data |> 
  pivot_longer(-ID, names_to = c("type", ".value"), names_pattern = "^(bl|ind|dup)(.*)$")
#> # A tibble: 18 × 6
#>    ID    type fluen  acur   dlp  nota
#>    <chr> <chr> <dbl> <dbl> <dbl> <dbl>
#>  1 p1    bl     77.6  5.33  69.3   7  
#>  2 p1    ind    97.4  5.05  52.4   6  
#>  3 p1    dup   102.   5.15  60.2   6  
#>  4 p2    bl     93.6  5.82  50.1   9  
#>  5 p2    ind    81.6  2.29  57.9   7.5
#>  6 p2    dup    97.8  7.54  56.8   8  
#>  7 p3    bl     96    4.46  55.7   8  
#>  8 p3    ind   104.   2.43  55.8   8  
#>  9 p3    dup   113.   1.53  46.2   9  
#> 10 p4    bl     59.7  8.97  59.7   4  
#> 11 p4    ind    82.1  7.69  61.0   5  
#> 12 p4    dup    93.9  7.21  63.3   6  
#> 13 p5    bl    108.   6.76  60.6   9  
#> 14 p5    ind   100.   8.41  54.6   9  
#> 15 p5    dup    96.4  3.77  65.3   8.5
#> 16 p6    bl     90    3.33  65.6   7  
#> 17 p6    ind    90.5 11.6   66.3   7  
#> 18 p6    dup    94.1  7.69  56.3   7.5

关于r - 一次旋转更长的十二列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74538732/

相关文章:

r - 我可以在单个 dplyr 语句中切换分组变量吗?

r - 将命名字符向量转换为 data.frame

excel - 在 Excel 2010 中,如何显示多个时间范围内特定日期的出现次数?

返回动态旋转数据的 SQL 函数

mysql - 如何在 MySQL 中返回数据透视表输出?

r - 如何 pivot_long 对不匹配日期的 date-var 组合?

r - 将值移动到不同的环境

R flexdashboard 标签集在服务器上呈现不佳

r - tidyverse 中变量的一堆重新编码(功能/元编程)

r - 在 unnest_wider 之后命名提升向量中的列