通过另一个数据框的一列对数据框进行排序 R

3

我知道这个问题以前已经被提出过了,但我的问题与我所见到的有些不同。我不能用以前的问题和答案来解决它。

我想使用另一个数据框的列对数据框进行排序。但有一个特殊情况。第一个数据框对于每个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

我不知道这意味着什么!

嗨,如果有任何答案解决了您的问题,请点击“接受它”,这样其他人就可以看到了。谢谢。 - agenis
3个回答

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
在你的问题中,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

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

非常感谢。但是当我使用脚本处理真实数据时,出现了问题:我得到了以下错误: Fula.sor<-Fula.s %>% arrange (fr2) %>% select(levels.dat.IID.) %>% left_join(Fula,by=c("IID"="levels.dat.IID.")) - Cebs
@Cebs 好的,看起来你没有粘贴完整的错误文本...? - agenis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接