我想从一个vector中删除元素的时间是它在另一个vector中出现的时间。就像我减去它们一样。假设我想删除的元素的vector中的每个元素也存在于我想删除的主vector中。
a <- c("A", "B", "B", "C", "C", "C")
b <- c("A", "B", "C", "C")
a[! a %in% b] #returns character(0)
#expected result = "B" "C"
我不想使用一个库。我宁愿写一个函数,如果可能的话没有循环。有没有办法做到这一点?提前谢谢你
5条答案
按热度按时间w41d8nur1#
这可能不是最有效的,但
有趣的是,这里有一个非
Reduce
的变体(通过查看AllanCameron的简单答案得到启发),它保持了顺序,只有在必须保持顺序的情况下,增加的复杂性才是值得的。使用较长的
a
更容易看到保存情况:tjjdgumg2#
在base R中,可以使用
pmatch
:请注意,在上述情况下,如果
b
中存在a
中不存在的值/级别,则需要0
如果
b
中的所有元素都在a
中,则满足以下条件注意事项
正如@jblood指出的,
pmatch
只适用于长度小于100的向量qmelpv7a3#
如果你想定义一个简单的函数,你可以这样做:
eulz3vhy4#
对
rowid
使用data.table
反联接:在更大的向量上测试它:
与来自this的
pmatch
解决方案比较答案:此外,
pmatch
似乎无法正确处理此问题:pmatch
返回的向量比预期的大得多。请获取两个答案之间的差异:检查
ab12
的第一个元素发生了什么。“28”在
a
中出现了57次,在b
中出现了45次,所以结果应该有12个“28”的示例,正如反连接返回的那样。然而,
pmatch
解决方案错误地返回了一个包含56个“28”示例的向量。8ehkhllq5#
结果