如何对多组列执行进阶pivot_longer转换实现数据重塑?
解决方案:用tidyr将宽表转换为长表
直接用tidyverse包中的tidyr::pivot_longer()函数就能高效完成这个转换,完美匹配你的列名格式(Sx_A/Sx_B)。
完整代码示例
# 先加载tidyverse包(未安装先执行install.packages("tidyverse")) library(tidyverse) # 你的原始数据 bd <- data.frame(Operator=c("Rater1", "Rater2", "Rater3"), S1_A=c("Good", "Good", "Bad"), S1_B=c(3,2,3), S2_A=c("Don't know", "Bad", "Don't know"), S2_B=c(4,4,2)) # 转换为目标长表格式 long_bd <- bd %>% pivot_longer( cols = -Operator, # 排除Operator列,处理剩余所有列 names_to = c("Sound", ".value"), # 按下划线拆分列名:第一部分存为Sound,第二部分作为新列名 sep = "_" # 指定拆分列名的分隔符 ) # 查看转换结果 print(long_bd)
关键参数说明
cols = -Operator:指定要转换的列是除Operator外的所有列,不管你有S1到S40多少个声音列,这个写法都通用。names_to = c("Sound", ".value"):核心逻辑,把拆分后的列名第一部分(如S1、S2)存入Sound列,第二部分(A、B)作为新列名,对应的值自动填充到这些列中。sep = "_":告诉函数用下划线作为列名的拆分标记。
转换后结果示例
# A tibble: 6 × 4 Operator Sound A B <chr> <chr> <chr> <dbl> 1 Rater1 S1 Good 3 2 Rater1 S2 Don't know 4 3 Rater2 S1 Good 2 4 Rater2 S2 Bad 4 5 Rater3 S1 Bad 3 6 Rater3 S2 Don't know 2
内容的提问来源于stack exchange,提问作者Buczinski
相关产品推荐
相关产品推荐

