如何删除/排除在另一个表中的表中的行

  • 本文关键字:另一个 排除 何删除 删除
  • 更新时间 :
  • 英文 :


我有2个数据。表格,a和b。'b'是'a'的固有子集。我想生成一个表'c',它包含'a'中但不包含'b'中的所有内容。我确信有一个简单的方法可以做到这一点,只是不确定如何。

这对你有用吗?

# to ensure we get the same `start'
set.seed(667)
# genrate a data.frame `a` with some data
a <- data.frame(z = sample(c(c(4,7),11,NA),  4, rep = TRUE), 
                x = sample(c(1, 2, 3, NA, 5, 6),  4, rep=TRUE), 
                y = sample(c(11, 12, 13, 14, 15, 16),  4, rep=TRUE))
# make a subset `b'
b <- a[1:2,]
# lets have a look at `a' and `b'
a
   z x  y
1  4 6 12
2  7 6 13
3 NA 5 14
4 11 6 16
b
  z x  y
1 4 6 12
2 7 6 13
b
# small function to solve your problme
setdiff.data.frame <- function(a,b) a[!duplicated( rbind(b,a) )[-seq_len(nrow(b))],]
# genrate c
c <- setdiff.data.frame(a,b)
# and let's see `c'
c
   z x  y
3 NA 5 14
4 11 6 16

同样,pengyu也写了一个函数,你可以在github上找到它。

这里有一种比较迂回的方法把它转换成矩阵,但是正如你将看到的,它确实产生了一些额外的工作。

A <- data.matrix(a, rownames.force = TRUE)
B <- data.matrix(b, rownames.force = TRUE) 
C <- A[!apply(A, 1, paste, collapse="$$") %in% apply(B, 1, paste, collapse="$$")]
C # now `C' is simply a string. SO we have to fold it back up, so to speak
[1] NA 11  5  6 14 16
C <- matrix(C, nrow = 2, ncol = 3, byrow = FALSE, 
            dimnames = list(c("1", "2"), c("z", "x", "y")))
C
   z x  y
1 NA 5 14
2 11 6 16

最新更新