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