对一个坐标系按另一个坐标系R的列排序



我知道这个问题是以前提出的,但我的问题与我所看到的有点不同。我不能用之前的问题和答案来解决它。

我想使用另一个数据框架的列对数据框架进行排序。但有一个特点。第一个数据帧对每个IID都有几行。下面是一个数据结构和问题的例子:

x<-c(rep("sc256",times=5),rep("sc784",times=5),rep("sc326",times=5),rep("sc120",times=5))
x2<-c("sc256","sc784","sc326","sc120")
y<-round(runif(20,1,10),digits=3)
y2<-round(runif(20,10,20),digits=3)
y3<-c(2,1,2,1)
M1<-data.frame(x,y,y2)
M2<-data.frame(x2,y3)
M2$y3<-as.factor(M2$y3)
M2.s<-M2[order(M2$y3),]
M1.s<-M1[order(M2.s$x),]

这个脚本生成一个数据帧M1。如:

      x     y     y2
2 sc256 6.585 17.115
3 sc256 7.794 14.855
4 sc256 5.038 15.650
1 sc256 7.451 16.205

这不是我想要的。我要找的是一个M1数据库,由M2第一列排列,像这样:

    x     y     y2
6  sc784 2.828 13.974
7  sc784 3.966 17.332
8  sc784 4.733 12.948
9  sc784 6.933 12.088
10 sc784 3.182 14.913
11 sc326 5.189 11.808
12 sc326 5.660 19.475
13 sc326 2.403 14.719
14 sc326 4.881 13.884
15 sc326 3.913 10.947
16 sc120 9.122 17.839
17 sc120 4.676 10.343
18 sc120 9.184 18.367
19 sc120 7.671 18.212
20 sc120 5.302 11.500
1  sc256 7.451 16.205
2  sc256 6.585 17.115
3  sc256 7.794 14.855
4  sc256 5.038 15.650
5  sc256 1.684 14.698

这确实是我的问题的一个小样本,因为在我的实际数据中,我有几千行。当我试图将这个脚本应用到我的真实数据时,我得到了这个错误:

Error in Fula[order(Fula.s$levels.dat.IID.), ] : subscript out of bounds

我不知道这是什么意思!

有可能:

> M1.s<-M1[order(M2$y3[match(M1$x,M2$x)]),]
> M1.s
       x     y     y2
6  sc784 5.193 19.458
7  sc784 6.307 14.398
8  sc784 1.042 11.436
9  sc784 5.392 15.096
10 sc784 9.124 13.521
16 sc120 6.496 19.087
17 sc120 3.128 12.793
18 sc120 8.870 10.844
19 sc120 1.245 18.832
20 sc120 3.448 11.475
1  sc256 2.426 13.556
2  sc256 4.208 11.488
3  sc256 6.842 12.782
4  sc256 9.088 13.648
5  sc256 5.746 11.052
11 sc326 6.421 17.500
12 sc326 6.938 16.412
13 sc326 8.216 14.833
14 sc326 6.500 10.606
15 sc326 3.897 10.517

在您的问题中,M1和M2数据框架具有相同的第一列顺序(或者我在您的问题中缺少某些内容)。我假设你有一个很大的数据框,你想要按较短数据框的第一列的顺序排序。由于这些列是因子,我们可以通过将较大的数据框按较短的数据框的顺序关联来实现:

x<-c(rep("sc256",times=5),rep("sc784",times=5),rep("sc326",times=5),rep("sc120",times=5))
# Change the order of second data.frame because otherwise nothing needs to be ordered
x2<-c("sc784","sc326","sc256", "sc120")
y<-round(runif(20,1,10),digits=3)
y2<-round(runif(20,10,20),digits=3)
y3<-c(2,1,2,1)
M1<-data.frame(x,y,y2)
M2<-data.frame(x2,y3)
M2$y3<-as.factor(M2$y3)
new.order <- M2$x2
M1.s <- M1
M1.s$x <- ordered(M1.s$x, new.order)
M1.s <- M1.s[order(M1.s$x),]
M1.s
       x     y     y2
6  sc784 5.555 13.150
7  sc784 8.647 12.967
8  sc784 7.338 11.909
9  sc784 1.272 15.863
10 sc784 6.477 17.091
11 sc326 5.240 15.350
12 sc326 7.923 18.450
13 sc326 7.258 13.867
14 sc326 3.132 19.233
15 sc326 4.373 15.142
1  sc256 8.160 17.038
2  sc256 1.775 15.460
3  sc256 9.310 19.261
4  sc256 8.354 14.930
5  sc256 1.724 19.410
16 sc120 8.284 12.614
17 sc120 1.479 17.149
18 sc120 8.164 14.561
19 sc120 3.469 16.971
20 sc120 4.083 10.136

如果你想按其他列排序,比如M2$y3,先给M2排序,然后重复:

M2 <- M2[order(M2$y3),]
sorted.by.y3 <- M2$x2
M1.s$x <- ordered(M1.s$x, sorted.by.y3)
M1.s[order(M1.s$x),]
M1.s
       x     y     y2
1  sc256 8.160 17.038
2  sc256 1.775 15.460
3  sc256 9.310 19.261
4  sc256 8.354 14.930
5  sc256 1.724 19.410
6  sc784 5.555 13.150
7  sc784 8.647 12.967
8  sc784 7.338 11.909
9  sc784 1.272 15.863
10 sc784 6.477 17.091
11 sc326 5.240 15.350
12 sc326 7.923 18.450
13 sc326 7.258 13.867
14 sc326 3.132 19.233
15 sc326 4.373 15.142
16 sc120 8.284 12.614
17 sc120 1.479 17.149
18 sc120 8.164 14.561
19 sc120 3.469 16.971
20 sc120 4.083 10.136

使用dplyr库:

library(dplyr)
M2 %>% arrange(y3) %>% select(x2) %>%  left_join(M1, by=c("x2"="x"))
####    x2     y     y2
#### 1  sc784 4.891 12.442
#### 2  sc784 3.850 19.154
#### 3  sc784 5.181 14.104
#### 4  sc784 1.359 11.206
#### 5  sc784 7.922 10.257
#### 6  sc120 8.402 10.958
#### 7  sc120 6.724 17.047
#### 8  sc120 5.451 18.919
#### 9  sc120 2.160 13.177
#### 10 sc120 9.573 10.977
#### 11 sc256 7.034 15.335
#### 12 sc256 7.758 19.715
#### 13 sc256 3.199 19.395
#### 14 sc256 7.698 10.704
#### 15 sc256 7.164 12.088
#### 16 sc326 8.525 17.018
#### 17 sc326 7.844 15.564
#### 18 sc326 7.008 16.835
#### 19 sc326 4.272 10.176
#### 20 sc326 5.889 17.272

注意:你应该定义一个set.seed,以便它是可复制的…

最新更新