R语言:多值列data.frame宽转长reshape函数结果异常排查
宽格式DataFrame转长格式:reshape函数的问题分析
示例数据
dw <- read.table(header=T, text=' sbj gender age avg.1 sd.1 avg.2 sd.2 A 1 22 10 6 50 10 B 1 23 12 5 70 11 C 2 21 20 7 20 8 D 2 20 22 8 22 9 ')
期望的长格式结果
## sbj gender age var avg sd ## A.1 A 1 22 1 10 6 ## B.1 B 1 23 1 12 5 ## C.1 C 2 21 1 20 7 ## D.1 D 2 20 1 22 8 ## A.2 A 1 22 2 50 10 ## B.2 B 1 23 2 70 11 ## C.2 C 2 21 2 20 8 ## D.2 D 2 20 2 22 9
你的代码问题
你当前的reshape代码中,varying参数的设置错误:
lg <- reshape(dw, idvar = c("sbj", "gender", "age"), varying = list(4:7), # 这里是错误核心 v.names = c("avg", "sd"), timevar = "var", direction = "long")
问题原因
reshape函数的varying参数需要对应v.names的分组:
- 你指定了
v.names = c("avg", "sd"),意味着要生成两个新列avg和sd - 因此
varying必须是一个包含2个元素的列表,每个元素对应宽格式中属于同一变量的列(比如avg.1和avg.2属于avg组,sd.1和sd.2属于sd组) - 你用
list(4:7)把4-7列全部归为一组,函数无法区分哪些列对应avg、哪些对应sd,自然输出不符合预期
修正后的代码
把varying参数改为按变量分组的列位置:
lg <- reshape(dw, idvar = c("sbj", "gender", "age"), varying = list(c(4, 6), c(5, 7)), # 第一组是avg的列,第二组是sd的列 v.names = c("avg", "sd"), timevar = "var", direction = "long")
或者更直观地用列名指定(可读性更强):
lg <- reshape(dw, idvar = c("sbj", "gender", "age"), varying = list(c("avg.1", "avg.2"), c("sd.1", "sd.2")), v.names = c("avg", "sd"), timevar = "var", direction = "long")
运行修正后的代码,就能得到你期望的长格式结果。
内容的提问来源于stack exchange,提问作者user257122
相关产品推荐
相关产品推荐

