[英]split data and re-arrange values based on split number
我有這個數據:
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'])
這給了我這個 output:
$`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
)。 split 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")))
從您的split
開始,您可以:
x<-split(m1[, 'row'], m1[, 'col'])
Map(function(a,b) b[order(match(b,a))], as.integer(names(x)), x)
一個想法是僅在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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.