如何从向量中删除多个值?但不是全部

时间:2018-04-09 22:00:02

标签: r

说我有两个向量,

set <- c(1, 1, 1, 1, 3, 3, 4, 4, 8, 8, 10)
played <- c(1, 3, 1, 4)

我想删除原始设置中的“播放”数字,我不想删除所有的1,3或4。 这样得到的矢量应该是,

1,1,3,4,8,8,10

目前我正在使用循环,但这不是一种非常有效的方法。是否有能力做我想做的事。

注意:这不是重复的重复 How to delete multiple values from a vector? 而是扩展,所有这些都是为了不删除所有的值。

重新编辑:我说订单很重要,但我错了。

6 个答案:

答案 0 :(得分:6)

您可以使用pmatch非常简单地获取它:

set[-pmatch(played,set)]
# [1]  1  1  3  4  8  8 10

这是另一个想法:

rep.int(seq_len(max(set)),tabulate(set)-tabulate(played,nbins=max(set)))
# [1]  1  1  3  4  8  8 10

答案 1 :(得分:4)

您可以使用table功能:

a=table(set)
b=table(played)
a[names(a)%in%names(b)]=a[names(a)%in%names(b)]-b
as.numeric(rep(names(a),a))

[1] 1  1  3  4  8  8 10

你也可以这样做:

a=merge(table(set),table(played),by.x="set",by.y="played",all=T)
a[is.na(a)]=0
as.numeric(as.character(rep(a$set,a$Freq.x-a$Freq.y)))
[1]  1  1  3  4  8  8 10

答案 2 :(得分:3)

仍在使用循环,但这似乎很不错:

p_list = split(played, cumsum(duplicated(played)))
for(p in seq_along(p_list)) {
    set = set[-match(p_list[[p]], set)]
}

set
# [1]  1  1  3  4  8  8 10

这会使played重复一次,以便我们可以在向量化的match调用中处理每个部分。

答案 3 :(得分:1)

可能只是一个简单的for-loop就可以了:

已编辑:根据@Gregor的建议。

set <- c(1, 1, 1, 1, 3, 3, 4, 4, 8, 8, 10)
played <- c(1, 3, 1, 4)
#Loop through 'played' and remove from 'set'
for(i in seq_along(played)){
  set <- set[-match(played[i],set)]
}
set
#[1]  1  1  3  4  8  8 10

答案 4 :(得分:1)

我为此创建了一个函数:

func <- function(set, played){

  for(i in 1:length(played)){
    ll <- which(set == played[i])
    set <- set[-ll[1]]
  }

  return(set)

}

答案 5 :(得分:-1)

这是sapply版本,但使用<<-有点危险,因为它打破了范围

sapply(played, function(x) {
  set <<- set[-match(x, set)]
}, simplify = FALSE)