为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

暮色呼如 2019-12-26 14:03:23
我想合并两个数据框,以保持其中一个的原始行顺序(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 prob1     1      B  0.52     1      C  0.53     2      A  0.74     2      D  0.75     3      F  0.3如果我添加sort = FALSE:merge(df.2, df.1, sort = F)                                                        结果是:  class object prob1     2      A  0.72     2      D  0.73     1      B  0.54     1      C  0.55     3      F  0.3但是我想要的是:  class object prob1     2      A  0.72     1      B  0.53     2      D  0.74     3      F  0.3    5     1      C  0.5
查看完整描述

3 回答

?
慕田峪9158850

TA贡献1794条经验 获得超7个赞

您只需要创建一个在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  <- 1:nrow(df.2)

out  <- merge(df.2,df.1, by = "class")

out[order(out$id), ]


查看完整回答
反对 回复 2019-12-26
?
慕容森

TA贡献1853条经验 获得超18个赞

您还可以inner_join在Hadley的dplyr程序包中(在的下一个迭代中plyr)检查该函数。它保留了第一个数据集的行顺序。与所需解决方案的微小区别在于,它还保留了第一个数据集的原始列顺序。因此,它不一定会将我们用于合并的列放在第一个位置。


使用上面的示例,inner_join结果如下所示:


inner_join(df.2,df.1)

Joining by: "class"

  object class prob

1      A     2  0.7

2      B     1  0.5

3      D     2  0.7

4      F     3  0.3

5      C     1  0.5


查看完整回答
反对 回复 2019-12-26
  • 3 回答
  • 0 关注
  • 570 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信