我有这两个载体:
first<-c(1,2,2,2,3,3,4)
second<-c(1,2)
现在我希望first
没有second
元素来获得如下结果:(2,2,3,3,4)
;确实,
我不希望删除所有2
,只想逐个减去。
我试过这个(来自here):
'%nin%' <- Negate('%in%')
first<-first[first %nin% second]
但它会移除2
中的所有first
并提供此结果:(3,3,4)
我该怎么做?
答案 0 :(得分:2)
试试这个:
first[-sapply(second, function(x) head(which(is.element(el=first, x)), 1))]
## [1] 2 2 3 3 4
如果您在second
中有重复的元素,那么这不会起作用。在这种情况下,我认为你需要一个循环:
first2 <- first
for(i in seq_along(second)) {
first2 <- first2[-head(which(is.element(el=first2, second[i])), 1)]
}
first2
# [1] 2 2 3 3 4
first2 <- first
second <- c(1,2,2)
for(i in seq_along(second)) {
first2 <- first2[-head(which(is.element(el=first2, second[i])), 1)]
}
first2
## [1] 2 3 3 4
答案 1 :(得分:1)
怎么样
second<-c(1, 2)
first[-match(second, first)]
## [1] 2 2 3 3 4
对于更复杂的案例,这里有一个使用<<-
second <- c(1, 2, 2)
invisible(lapply(second, function(x) first <<- first[-match(x, first)]))
first
## [1] 2 3 3 4