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

时间:2014-08-01 16:28:26

标签: r

我有2个data.tables,'a'和'b'。 'b'是'a'的适当子集。我想生成一个表'c',其中包含'a'但不包含在'b'中的所有内容。我确信有一个简单的方法可以做到这一点,只是不确定如何。

1 个答案:

答案 0 :(得分:1)

这对你有用吗?

# 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为此写了一个函数,你可以find it on 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