那是x \ y
使用数学符号。假设
x <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,1,3)
y <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
如何获得包含x中不在y中的所有值的向量。结果应该是:
2,1,1,3
有一个类似的问题here。但是,没有一个答案会返回我想要的结果。
答案 0 :(得分:7)
这是一个使用pmatch
的解决方案(根据需要提供“补充”):
x <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,2,1,1,1,3)
y <- c(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1)
res <- x[is.na(pmatch(x,y))]
来自pmatch
文档:
“如果duplicates.ok为FALSE,则匹配的表格的值将从搜索后续匹配中排除。”
答案 1 :(得分:5)
这个怎么样:
R> x[x!=y]
[1] 2 1 1 1 3
Warning message:
In x != y : longer object length is not a multiple of shorter object length
R>
我认为这是一个难题,因为你在混合价值观和立场。更简单的解决方案依赖于R中的一个“set”函数:
R> setdiff(x,y)
[1] 2 3
但是它只使用值而不是位置。
我给你的答案的问题是隐含使用回收及其触发的警告:由于x
比y
长,y
的前几个值得到重用。但是当较长的向量具有较短向量长度的整数倍长度时,回收被认为是“干净的”。但事实并非如此,因此我不确定我们是否可以干净利落地解决您的问题。
答案 2 :(得分:3)
如果我理解了这个问题,你可以使用table
来计算每个集合中元素数量的差异,然后根据这些计数的差异创建一个向量(请注意,这不一定会给出你在问题中给出的命令。
> diffs <- table(x) - table(factor(y, levels=levels(factor(x))))
> rep(as.numeric(names(diffs)), ifelse(diffs < 0, 0, diffs))
[1] 1 1 2 3