合并两个数据帧,同时保持原始行顺序

我想合并两个数据框,以保持其中一个的原始行顺序(df.2在下面的示例中)。


以下是一些示例数据(class列中的所有值都在两个数据帧中定义):


df.1 <- data.frame(class = c(1, 2, 3), prob = c(0.5, 0.7, 0.3))

df.2 <- data.frame(object = c('A', 'B', 'D', 'F', 'C'), class = c(2, 1, 2, 3, 1))

如果我做:


merge(df.2, df.1)

输出为:


  class object prob

1     1      B  0.5

2     1      C  0.5

3     2      A  0.7

4     2      D  0.7

5     3      F  0.3

如果我添加sort = FALSE:


merge(df.2, df.1, sort = F)                                                        

结果是:


  class object prob

1     2      A  0.7

2     2      D  0.7

3     1      B  0.5

4     1      C  0.5

5     3      F  0.3

但是我想要的是:


  class object prob

1     2      A  0.7

2     1      B  0.5

3     2      D  0.7

4     3      F  0.3    

5     1      C  0.5


暮色呼如
浏览 537回答 3
3回答

慕田峪9158850

您只需要创建一个在df.2中给出行号的变量即可。然后,一旦合并了数据,就可以根据此变量对新数据集进行排序。这是一个例子:df.1<-data.frame(class=c(1,2,3), prob=c(0.5,0.7,0.3))df.2<-data.frame(object=c('A','B','D','F','C'), class=c(2,1,2,3,1))df.2$id&nbsp; <- 1:nrow(df.2)out&nbsp; <- merge(df.2,df.1, by = "class")out[order(out$id), ]

慕容森

您还可以inner_join在Hadley的dplyr程序包中(在的下一个迭代中plyr)检查该函数。它保留了第一个数据集的行顺序。与所需解决方案的微小区别在于,它还保留了第一个数据集的原始列顺序。因此,它不一定会将我们用于合并的列放在第一个位置。使用上面的示例,inner_join结果如下所示:inner_join(df.2,df.1)Joining by: "class"&nbsp; object class prob1&nbsp; &nbsp; &nbsp; A&nbsp; &nbsp; &nbsp;2&nbsp; 0.72&nbsp; &nbsp; &nbsp; B&nbsp; &nbsp; &nbsp;1&nbsp; 0.53&nbsp; &nbsp; &nbsp; D&nbsp; &nbsp; &nbsp;2&nbsp; 0.74&nbsp; &nbsp; &nbsp; F&nbsp; &nbsp; &nbsp;3&nbsp; 0.35&nbsp; &nbsp; &nbsp; C&nbsp; &nbsp; &nbsp;1&nbsp; 0.5
打开App,查看更多内容
随时随地看视频慕课网APP