【发布时间】:2018-03-24 20:12:58
【问题描述】:
我的数据如下所示:
mydata <- data.frame(id = c(1,1,1,2,2,3,3,3,3),
subid = c(1,2,3,1,2,1,2,3,4),
time = c(16, 18, 20, 10, 11, 7, 9, 10, 11))
id subid time
1 1 1 16
2 1 2 18
3 1 3 20
4 2 1 10
5 2 2 11
6 3 1 7
7 3 2 9
8 3 3 10
9 3 4 11
我的目标是将数据转换为:
newdata <- data.frame(id = c(1,1,1,2,3,3,3,3,3,3),
subid.1 = c(1,1,2,1,1,1,1,2,2,3),
subid.2 = c(2,3,3,2,2,3,4,3,4,4),
time.1 = c(16,16,18,10,7,7,7,9,9,10),
time.2 = c(18,20,20,11,9,10,11,10,11,11))
id subid.1 subid.2 time.1 time.2
1 1 1 2 16 18
2 1 1 3 16 20
3 1 2 3 18 20
4 2 1 2 10 11
5 3 1 2 7 9
6 3 1 3 7 10
7 3 1 4 7 11
8 3 2 3 9 10
9 3 2 4 9 11
10 3 3 4 10 11
所以这不是从长到宽过程的简单重塑:这个想法是,在由 id 定义的组内,采用所有可能的组合 subid 及其对应的时间值,并将它们转换为宽格式。
我知道我可以使用例如gtools::combinations 获得所有可能的组合。第一组由 3 行组成,所以
gtools::combinations(n=3, r=2)
为我提供组 id==1 的新 subid.1 和 subid.2 对的矩阵:
[,1] [,2]
[1,] 1 2
[2,] 1 3
[3,] 2 3
但是我不知道如何继续(既不将id==1 的组重塑为这种格式,也不知道如何为每个组单独执行此操作)。谢谢!
【问题讨论】: