我有此数据:
row col
[1,] 1 1
[2,] 7 1
[3,] 2 2
[4,] 7 2
[5,] 18 2
[6,] 3 3
[7,] 4 4
[8,] 5 5
[9,] 19 5
[10,] 6 6
[11,] 1 7
[12,] 2 7
[13,] 7 7
[14,] 18 7
[15,] 8 8
[16,] 9 9
[17,] 10 10
[18,] 11 11
[19,] 12 12
[20,] 13 13
[21,] 18 13
[22,] 14 14
[23,] 15 15
[24,] 16 16
[25,] 17 17
[26,] 2 18
[27,] 7 18
[28,] 13 18
[29,] 18 18
[30,] 5 19
[31,] 19 19
[32,] 20 20
我想根据订购时的某些条件将其拆分。我可以使用以下方法拆分它:
split(m1[, 'row'], m1[, 'col'])
哪个给我这个输出:
$`1`
[1] 1 7
$`2`
[1] 2 7 18
$`3`
[1] 3
$`4`
[1] 4
$`5`
[1] 5 19
$`6`
[1] 6
$`7`
[1] 1 2 7 18
$`8`
[1] 8
$`9`
[1] 9
$`10`
[1] 10
$`11`
[1] 11
$`12`
[1] 12
$`13`
[1] 13 18
$`14`
[1] 14
$`15`
[1] 15
$`16`
[1] 16
$`17`
[1] 17
$`18`
[1] 2 7 13 18
$`19`
[1] 5 19
$`20`
[1] 20
但是,我想保持点菜顺序。拆分1
-6
是正确的,因为拆分1
中的第一个值为1
(第二个值为7
)。拆分2
中的第一个值为2
(第二个为7
,第三个为18
)。模式一直持续到它在拆分7
上中断为止。我希望将7
拆分为:
$`7`
[1] 7 1 2 18
将8
拆分为17
也很好。由于第一个数字对应于分割数。我希望将18
和19
拆分为:
$`18`
[1] 18 2 7 13
$`19`
[1] 19 5
如何使用此结构拆分数据?
数据:
m1 <- structure(c(1L, 7L, 2L, 7L, 18L, 3L, 4L, 5L, 19L, 6L, 1L, 2L,
7L, 18L, 8L, 9L, 10L, 11L, 12L, 13L, 18L, 14L, 15L, 16L, 17L,
2L, 7L, 13L, 18L, 5L, 19L, 20L, 1L, 1L, 2L, 2L, 2L, 3L, 4L, 5L,
5L, 6L, 7L, 7L, 7L, 7L, 8L, 9L, 10L, 11L, 12L, 13L, 13L, 14L,
15L, 16L, 17L, 18L, 18L, 18L, 18L, 19L, 19L, 20L), .Dim = c(32L,
2L), .Dimnames = list(NULL, c("row", "col")))
答案 0 :(得分:3)
从split
开始,您可以:
x<-split(m1[, 'row'], m1[, 'col'])
Map(function(a,b) b[order(match(b,a))], as.integer(names(x)), x)
答案 1 :(得分:2)
一个想法是仅在col
上将其拆分为数据帧,因此我们将它们作为数据帧元素。使用row
,我们可以在col
中找到与row
相同的数字,将其放在第一位,然后再跟随其他数字,即
lapply(split(data.frame(m1), m1[, 'col']), function(i) {
i1 <- which(i$col == i$row);
i$row[c(i1, seq(nrow(i))[-i1])]})
检查失败的订单,
lapply(split(data.frame(m1), m1[, 'col']), function(i) {i1 <- which(i$col == i$row); i$row[c(i1, seq(nrow(i))[-i1])]})[7]
#$`7`
#[1] 7 1 2 18
lapply(split(data.frame(m1), m1[, 'col']), function(i) {i1 <- which(i$col == i$row); i$row[c(i1, seq(nrow(i))[-i1])]})[18]
#$`18`
#[1] 18 2 7 13
lapply(split(data.frame(m1), m1[, 'col']), function(i) {i1 <- which(i$col == i$row); i$row[c(i1, seq(nrow(i))[-i1])]})[19]
#$`19`
#[1] 19 5