【问题标题】:Removing one table from another in R [closed]在R中从另一个表中删除一个表[关闭]
【发布时间】:2015-12-17 02:43:15
【问题描述】:

我在 R 中有一个名为 A 的数据表,其中包含三列 Col1、Col2 和 Col3。另一个名为 B 的表也具有相同的三列。我想删除表 A 中的所有行,其中表 B 中存在对 (Col1, Col2)。我试过了,但我不知道该怎么做。在过去的几天里,我一直坚持这一点。

谢谢,

【问题讨论】:

  • 由于问题已关闭但重复的目标,这里还有一个基础:subset(merge(A,'[[<-'(B,"x",value=1),all.x=T),is.na(x),1:ncol(A))

标签: r row data.table


【解决方案1】:
library(data.table)
A = data.table(Col1 = 1:4, Col2 = 4:1, Col3 = letters[1:4])
#   Col1 Col2 Col3
#1:    1    4    a
#2:    2    3    b
#3:    3    2    c
#4:    4    1    d

B = data.table(Col1 = c(1,3,5), Col2 = c(4,2,1))
#   Col1 Col2
#1:    1    4
#2:    3    2
#3:    5    1

A[!B, on = c("Col1", "Col2")]
#   Col1 Col2 Col3
#1:    2    3    b
#2:    4    1    d

【讨论】:

    【解决方案2】:

    我们可以使用anti_join

    library(dplyr)
    anti_join(A, B, by = c('Col1', 'Col2'))
    

    【讨论】:

      【解决方案3】:

      试一试,使用interaction

      A <- data.frame(Col1=1:3, Col2=2:4, Col3=10:12)
      B <- data.frame(Col1=1:2, Col2=2:3, Col3=10:11)
      A
      #  Col1 Col2 Col3
      #1    1    2   10
      #2    2    3   11
      #3    3    4   12
      
      B
      # Col1 Col2 Col3
      #1    1    2   10
      #2    2    3   11
      
      byv <- c("Col1","Col2")
      A[!(interaction(A[byv]) %in% interaction(B[byv])),]
      
      #  Col1 Col2 Col3
      #3    3    4   12
      

      或者为每一行创建一个唯一的id,然后排除合并的那些:

      A[-merge(cbind(A[byv],id=seq_len(nrow(A))), B[byv], by=byv)$id,]
      

      【讨论】:

      • 我看不懂这个例子中byv的用法。
      • @Sumit - 抱歉,忘记粘贴带有 byv 的链接,其中包含 by 变量。
      • 感谢您的回答。它非常整洁。顺便说一句,交互是否适用于数据表?
      猜你喜欢
      • 1970-01-01
      • 2021-06-07
      • 2012-09-10
      • 1970-01-01
      • 1970-01-01
      • 2023-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多