在中间重塑 [英] Reshape in the middle
本文介绍了在中间重塑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
作为试点调查的一部分,我向每个土耳其人提供了四种选择中的一组。数据如下:
> so
WorkerId pio_1_1 pio_1_2 pio_1_3 pio_1_4 pio_2_1 pio_2_2 pio_2_3 pio_2_4
1 1 Yes No No No No No Yes No
2 2 No Yes No No Yes No Yes No
3 3 Yes Yes No No Yes No Yes No
我希望它是这样的:
WorkerId set pio1 pio2 pio3 pio4
1 1 Yes No No No
1 2 No No Yes No
...
我可以通过许多方法勉强度过难关,但没有一种方法看起来很优雅:
- 用正则表达式和反向引用交换数字顺序,然后使用rehape()
- 编写自己的小函数来解析下划线之间的第一个数字,然后对其进行长整形
- 拆分然后堆叠列(取决于顺序是否正确)
但在我看来,所有这些似乎都忽略了这样一个概念,即您可能称之为"双宽"格式的数据有其自己的结构。我很乐意使用reshape2包来完成这项工作,但是尽管CAST()已经生成了数据,但我没有看到任何可以帮助我真正将这些数据融化的选项。请回过头来。
欢迎提出建议。
so <- structure(list(WorkerId = 1:3, pio_1_1 = structure(c(2L, 1L,
2L), .Label = c("No", "Yes"), class = "factor"), pio_1_2 = structure(c(1L,
2L, 2L), .Label = c("No", "Yes"), class = "factor"), pio_1_3 = structure(c(1L,
1L, 1L), .Label = c("No", "Yes"), class = "factor"), pio_1_4 = structure(c(1L,
1L, 1L), .Label = "No", class = "factor"), pio_2_1 = structure(c(1L,
2L, 2L), .Label = c("No", "Yes"), class = "factor"), pio_2_2 = structure(c(1L,
1L, 1L), .Label = c("No", "Yes"), class = "factor"), pio_2_3 = structure(c(2L,
2L, 2L), .Label = c("No", "Yes"), class = "factor"), pio_2_4 = structure(c(1L,
1L, 1L), .Label = "No", class = "factor")), .Names = c("WorkerId",
"pio_1_1", "pio_1_2", "pio_1_3", "pio_1_4", "pio_2_1", "pio_2_2",
"pio_2_3", "pio_2_4"), row.names = c(NA, 3L), class = "data.frame")
推荐答案
我不确定这是否太明显,但这里有。它应该不言而喻。传入您的so
数据帧,它将返回整形后的数据。
library("reshape2")
reshape.middle <- function(dat) {
dat <- melt(so, id="WorkerId")
dat$set <- substr(dat$variable, 5,5)
dat$name <- paste(substr(dat$variable, 1, 4),
substr(dat$variable, 7, 7),
sep="")
dat$variable <- NULL
dat <- melt(dat, id=c("WorkerId", "set", "name"))
dat$variable <- NULL
return(dcast(dat, WorkerId + set ~ name))
}
so # initial form
so <- reshape.middle(so)
so # as needed
希望这能有所帮助。
这篇关于在中间重塑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文