说我有两个向量,
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? 而是扩展,所有这些都是为了不删除所有的值。
重新编辑:我说订单很重要,但我错了。
答案 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)