【发布时间】:2013-12-03 10:37:30
【问题描述】:
我正在寻找的是一种删除单个非唯一元素的有效方法。
假设我有向量:
c(1,1,1,2,2,3,3,4)
我想删除:
c(1,2)
这样的结果是
c(1,1,2,3,3,4)
我确信它非常简单,但我不知所措。出声!
【问题讨论】:
我正在寻找的是一种删除单个非唯一元素的有效方法。
假设我有向量:
c(1,1,1,2,2,3,3,4)
我想删除:
c(1,2)
这样的结果是
c(1,1,2,3,3,4)
我确信它非常简单,但我不知所措。出声!
【问题讨论】:
您要查找的函数是match。这是代码
a <- c(1,1,1,2,2,3,3,4)
b <- c(1,2)
a[-match(b, a)]
### [1] 1 1 2 3 3 4
之所以有效,是因为matchonly 返回其第一个参数在第二个参数中的 (first) 匹配位置的向量。
编辑:正如@Ananda Mahto 所指出的,这仅在b 中的所有元素也在a 中时才有效。对于更通用的公式,请使用以下函数
element_rm <- function(a, b){
if (any(b%in%a)) return(a[-match(b[b%in%a], a)])
else return(a)
}
a <- c(1,1,1,2,2,3,3,4)
element_rm(a, c(1,2))
## [1] 1 1 2 3 3 4
element_rm(a, c(2,5))
## [1] 1 1 1 2 3 3 4
element_rm(a, 5)
## [1] 1 1 1 2 2 3 3 4
element_rm(a, c(4,4))
## [1] 1 1 1 2 2 3 3
【讨论】:
a[-match(which(b %in% a), a)]。与b <- c(1, 7)(或输入向量中不存在的其他值)的情况进行比较。事实上,里面应该也有一个ifelse。