我有两个向量
x <- c(1,2,2,3,4)
y <- c(1,2,3)
我想得到x中不在y中的元素的另一个向量;所以在这种情况下(2,4)。
我已经尝试过使用setdiff()函数,但是它没有考虑重复项(它只会返回4个),所以我不确定该怎么做。
谢谢!
答案 0 :(得分:5)
也许尝试一下:
x[-match(y,x,nomatch = 0)]
nomatch = 0
对于避免将NA与否定下标混在一起是必需的。
要处理其他重复项,如评论中所述,另一种选择可能是使用软件包 vecsets 中的vsetdiff
:
library(vecsets)
x = c(1, 2, 2, 3, 3, 4)
y = c(1, 2, 2, 3)
> vsetdiff(x,y)
[1] 3 4
答案 1 :(得分:0)
它不会提供@Gregor讨论的结果,但是,应根据示例给出正确的结果:
x[duplicated(x) | !x %in% y]
[1] 2 4
个别步骤:
duplicated(x)
[1] FALSE FALSE TRUE FALSE FALSE
!x %in% y
[1] FALSE FALSE FALSE FALSE TRUE
duplicated(x) | !x %in% y
[1] FALSE FALSE TRUE FALSE TRUE
答案 2 :(得分:0)
考虑到OP的原始示例并阅读@Gregor的注释,我编写了以下函数,该函数可以执行OP所需的功能,并考虑到@Gregor指出的内容
## function to find values in x that are absent in y
x.not.in.y <- function(x, y) {
# get freq tables for x and y
x.tab <- table(x)
y.tab <- table(y)
# if a value is missing in y then set its freq to zero
y.tab[setdiff(names(x.tab), names(y.tab))] = 0
y.tab <- y.tab[names(y.tab) %in% names(x.tab)]
# get the difference of x and y freq and keep if > 0
diff.tab <- x.tab[order(names(x.tab))] - y.tab[order(names(y.tab))]
diff.tab <- diff.tab[diff.tab > 0]
# output vector of x values missing in y
unlist(
lapply(names(diff.tab), function(val) {
rep(as.numeric(val), diff.tab[val])
}),
use.names = F)
}
# OP's original data
x.not.in.y(x = c(1,2,2,3,4), y = c(1,2,3))
#> [1] 2 4
# @Gregor's data
x.not.in.y(x = c(1,2,2,3,3,4), y = c(1,2,2,3))
#> [1] 3 4
# some other data with extra value in y but absent in y
x.not.in.y(x = c(1,2,2,2,2,3,3,3,4,5), y = c(1,2,3,6))
#> [1] 2 2 2 3 3 4 5
由reprex package(v0.2.1)于2019-04-15创建