按照另一个d.frame R

时间:2016-09-28 11:14:49

标签: r sorting dataframe

我知道这个问题之前已经提出过,但我的问题与我所看到的有点不同。以前的问题和答案我无法解决。

我想使用另一个数据框的列对数据框进行排序。但具有特殊性。第一个数据帧为每个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.s,如下所示:

      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

这不是我想要的。我正在寻找的是由M2第一列排列的M1数据库,如下所示:

    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

我不知道是什么意思!

3 个答案:

答案 0 :(得分:2)

这是一种可能性:

> 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

答案 1 :(得分:1)

在您的问题中,M1和M2 data.frame与第一列的顺序相同(或者我在您的问题中遗漏了某些内容)。我假设你有一个data.frame很大,你想按照较短数据帧的第一列的顺序排序。由于这些列是因素,我们可以通过将较大的数据帧重新定义为短数据帧的顺序来实现这一点:

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

答案 2 :(得分:0)

使用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,以便它可以重现......