【问题标题】:R Efficient way to create new data frame from unique rows between two data framesR从两个数据帧之间的唯一行创建新数据帧的有效方法
【发布时间】:2016-11-21 21:25:56
【问题描述】:

我需要在两个现有数据帧中创建一个新数据帧,其中新数据帧是第一个数据帧中不在第二个数据帧中的每一行。我使用允许我这样做的合并功能找到了一些代码here。基本上,如果生成的合并有结果,那么该行就在数据框中,我不会将它添加到我的新行中:

for (j in 1:nrow(my.df)) {
    if(nrow(merge(my.df[j,],sample.df))==0) {
        test.df <- rbind(test.df,my.df[j,])
    }
}

问题在于 for 循环非常慢。考虑到我的限制,有没有更有效的方法来构建数据框?

my.df

A B class
1 2 x
2 3 y
3 4 z

sample.df

A B class
1 2 x

test.df 应该是这样的

A B class
2 3 y
3 4 z

【问题讨论】:

  • 查看?dplyr::setdiff()?dplyr::anti_join() 以获得更多帮助,请发布具有理想输出的可重现示例:)
  • 代码是可重现的,您只需要两个数据框,您将获得我正在寻找的所需输出(代码按原样工作)。我只是在寻找一种更快的方法。
  • my.df 看起来像什么? sample.df 怎么样?
  • 我已经包含了一个数据框的示例

标签: r dataframe compare


【解决方案1】:

使用library(dplyr)我们可以使用anti_join()

anti_join(my.df, sample.df)
# Joining, by = c("A", "B", "class")
#   A B class
# 1 3 4     z
# 2 2 3     y

正如@Gregor 所提到的,您还可以使用library(data.table)data.frames 转换为data.tables 以获得更快的速度

【讨论】:

  • 这行得通。有明显的加速。现在够了。我将尝试转换为表格以获得更快的速度。
  • 是的,如果您指定anti_join(..., by = c("variable1, variable2)),则会出现警告以显示它选择匹配的列,默认情况下,这两个数据帧之间共享的所有常用名称
猜你喜欢
  • 2022-08-12
  • 2017-12-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多