在一组列上顺序进行高级pivot_longer转换

问题描述 投票:0回答:1

我对进行这个争论程序的确切方法有点困惑。

我有一个数据集,其中包含评估肺音的评估者(S1,...,S40)。对于每种声音,评估录音的某些质量(_A、_B、_X)。

数据框看起来像这个 bd 示例(我给出了一个有 3 个评分者的示例,为 2 个不同的特征 A 和 B 的 2 个声音评分)。 您可以看到,每一行代表不同声音 (S_1、S_2) 和声音特征 (_A、_B) 的 1 个评分者结果。

bd <- data.frame(Operator=c("Rater1", "Rater2", "Rater3"),
                    S1_A=c("Good", "Good", "Bad"), #quality assessment
                    S1_B=c(3,2,3), #confidence in assessment 1-5 likert scale          
                    S2_A=c("Don't know", "Bad", "Don't know"),
                    S2_B=c(4,4,2))

我想得到这样的结果:

操作员 声音 A B
评分者1 1 3
评分者1 2 不知道 4
评分者2 1 2
评分者2 2 不好 4
评分者3 1 不好 3
评分者3 2 不知道 2

我无法充分设计代码来首先创建识别声音的列,然后添加声音特征。

提前感谢您的帮助!

tidyr data-wrangling
1个回答
0
投票

您可以将

names_pattern =
与正则表达式一起使用来实现您想要的结果:

library(dplyr)
library(tidyr)
  
bd |>
  pivot_longer(cols = -Operator, 
               names_to = c("Session", ".value"), 
               names_pattern = "S(\\d)_(A|B)")

# # A tibble: 6 × 4
#   Operator Session A              B
#   <chr>    <chr>   <chr>      <dbl>
# 1 Rater1   1       Good           3
# 2 Rater1   2       Don't know     4
# 3 Rater2   1       Good           2
# 4 Rater2   2       Bad            4
# 5 Rater3   1       Bad            3
# 6 Rater3   2       Don't know     2
© www.soinside.com 2019 - 2024. All rights reserved.