【问题标题】:R: remove rows from one data frame that are in anotherR:从一个数据框中删除另一个数据框中的行
【发布时间】:2012-06-06 02:10:16
【问题描述】:

我有两个数据框 df1 和 df2。它们具有相同的(两)列。我想从 df1 中删除 df2 中的行。

【问题讨论】:

标签: r


【解决方案1】:

您可以使用多个软件包来做到这一点。但这里是如何使用基本 R 来做到这一点。

df1 <-matrix(1:6,ncol=2,byrow=TRUE)
df2 <-matrix(1:10,ncol=2,byrow=TRUE)
all <-rbind(df1,df2) #rbind the columns
#use !duplicated fromLast = FALSE and fromLast = TRUE to get unique rows.
all[!duplicated(all,fromLast = FALSE)&!duplicated(all,fromLast = TRUE),] 

     [,1] [,2]
[1,]    7    8
[2,]    9   10

【讨论】:

  • 我喜欢这个,但我不明白。我喜欢它,因为(与其他答案不同)它使我的数据框中的所有三个变量保持不变(另一个答案删除了这些变量并添加了一个新的“v1”,它似乎是来自原始 DF 之一的 row.names)。我不明白,因为这是我第一次看到使用“!duplicated” - 加上(或“and”?)我不明白“fromLast”“FALSE”和“TRUE”部分是如何工作的。还有什么要学的。但这是一个优雅的解决方案。
  • 您好,该解决方案是否也适用于超过 2 次重复的行?
  • @eclairs 如果我正确理解您的问题,是的,此解决方案将排除多个重复项。
【解决方案2】:

试试这个:

df2 <-matrix(1:6,ncol=2,byrow=TRUE)
df1 <-matrix(1:10,ncol=2,byrow=TRUE)

data.frame(v1=setdiff(df1[,1], df2[,1]), v2=setdiff(df1[,2], df2[,2]))
  v1 v2
1  7  8
2  9 10

请注意,df1df2 与 Lapointe 的相同,但反之亦然,因为您想从 df1 中删除 df2 中的行,因此 setdiff 会从 x 中删除包含在y。见?setdiff

您将获得与 Lapointe 相同的结果

【讨论】:

    【解决方案3】:

    考虑到您有一个在两个数据帧之间匹配的变量 (var_match),我得到了一个简单的方法:

    df_1_minus_2 <- df_1[which(!df_1$var_match %in% df_2$var_match),]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-04
      • 2020-11-13
      • 2023-02-17
      • 2016-01-07
      • 2018-06-22
      • 2016-09-15
      • 1970-01-01
      • 2020-08-16
      相关资源
      最近更新 更多