R语言使用pivot_longer处理多列数据的实现问题
解决R数据格式转换问题:从HAVE到WANT
问题背景
现有如下HAVE数据集:
HAVE = data.frame( COURSE =c(1, 1, 1, 2, 2, 2, 3, 3, 3), STUDENT =c('A', 'B', 'C', 'A', 'B', 'C', 'A', 'B', 'C'), FISH =c(4, 8, 9, 1, 7, 1, 10, 10, 10), CAT =c(9, 8, 10, 7, 1, 2, 8, 0, 2), FOX =c(7, NA, 9, 0, NA, 10, 5, NA, 10), BUNNIE =c(6, NA, 0, 5, NA, 6, 4, NA, 1), RABBIT =c(2, NA, 0, 6, NA, 8, 3, NA, 0) )
需要转换为WANT数据集:
WANT = data.frame( COURSE =c(1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3), TEST =c('FISH', 'CAT', 'FOX', 'BUNNIE', 'RABBIT', 'FISH', 'CAT', 'FOX', 'BUNNIE', 'RABBIT', 'FISH', 'CAT', 'FOX', 'BUNNIE', 'RABBIT'), A =c(4, 9, 7, 6, 2, 1, 7, 0, 5, 6, 10, 8, 5, 4, 3), B =c(8, 8, NA, NA, NA, 7, 1, NA, NA, NA, 10, 0, NA, NA, NA), C =c(9, 10, 9, 0, 0, 1, 2, 10, 6, 8, 10, 2, 10, 1, 0) )
尝试执行代码WANT = HAVE %>% pivot_longer(FISH:RABBIT, names_to = "TEST", values_to = A:C)未成功,以下是正确实现方法。
错误原因
pivot_longer的values_to参数只能指定单个列名,用来存放长格式下的数值,不能直接定义多列(比如A:C)。你的需求需要先将测试项目列转为长格式,再将学生列转为宽格式,分两步完成。
正确代码
使用tidyr包的pivot_longer和pivot_wider组合实现:
library(tidyverse) WANT = HAVE %>% # 第一步:将测试项目列(FISH到RABBIT)转为长格式 pivot_longer( cols = FISH:RABBIT, names_to = "TEST", values_to = "score" ) %>% # 第二步:将STUDENT的不同取值(A/B/C)转为列,对应score的值 pivot_wider( id_cols = c(COURSE, TEST), names_from = STUDENT, values_from = score )
验证结果
运行上述代码后,得到的数据集与目标WANT完全一致,包含COURSE、TEST、A、B、C列,且数值匹配。
内容的提问来源于stack exchange,提问作者bvowe
相关产品推荐
相关产品推荐

