首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >拆分数据并根据拆分的数字重新排列值

拆分数据并根据拆分的数字重新排列值
EN

Stack Overflow用户
提问于 2019-11-05 22:51:04
回答 2查看 36关注 0票数 1

我有这样的数据:

代码语言:javascript
复制
      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

我想根据排序的一些条件来拆分它。我可以使用以下命令拆分它:

代码语言:javascript
复制
split(m1[, 'row'], m1[, 'col'])

这给出了下面的输出:

代码语言:javascript
复制
$`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)。该模式将继续下去,直到它在split 7上断开。我希望拆分7看起来像这样:

代码语言:javascript
复制
 $`7`
[1]  7  1  2  18

8拆分到17也是可以的。因为第一个数字对应于分割的数字。我希望拆分1819看起来像这样:

代码语言:javascript
复制
$`18`
[1]  18  2  7 13

$`19`
[1]  19  5

如何使用此结构拆分数据?

数据:

代码语言:javascript
复制
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")))
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-05 23:05:26

split开始,您可以:

代码语言:javascript
复制
x<-split(m1[, 'row'], m1[, 'col'])
Map(function(a,b) b[order(match(b,a))], as.integer(names(x)), x)
票数 3
EN

Stack Overflow用户

发布于 2019-11-05 23:06:30

一个想法是只在col上将其拆分为数据帧,这样我们就可以将它们作为数据帧元素。使用row,我们可以在col中找到与row相同的数字,将其放在第一位,然后跟随其他数字,即

代码语言:javascript
复制
lapply(split(data.frame(m1), m1[, 'col']), function(i) {
                                        i1 <- which(i$col == i$row); 
                                        i$row[c(i1, seq(nrow(i))[-i1])]})

检查失败的订单,

代码语言:javascript
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58713886

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档