我试图在R中做一个函数,使得 如果X是一个向量而Y是一个向量是X的一个子集,X和Y可能包含一个重复元素,则XY包含其余元素(可能仍包含重复元素)。我尝试使用setdiff()
,但我认为它不适用于重复元素。例如,R编程:向量之间的差异
d<-c(1,1,1,5,5,5,3,0,10,10)
b<-c(1,1,0)
e<-setdiff(d,b)
e
[1] 5 3 10
,但它应该是
c(1,5,5,5,3,10,10)
所以我做了一个功能
my.sample<-function(d,b){
y<-numeric()
u<-numeric()
t<-list()
x<-numeric()
rd<-rle(d)
rb<-rle(b)
h<-numeric()
d.data<-data.frame(rd$lengths,rd$values)
b.data<-data.frame(rb$lengths,rb$values)
for(i in 1:nrow(b.data)){
y[i]<-b.data[i,2]
u[i]<-b.data[i,1]
h[i]<-(d.data[d.data$rd.values==y[i],1]-u[i])
d.data[d.data$rd.values==y[i],1]<-h[i]
}
x<-d.data[,1]
for(j in 1:length(x))
{
t[[j]]<-rep(d.data[j,2],x[j])
}
return(unlist(t))
}
所以我尝试
my.sample(d,b)
[1] 1 5 5 5 3 10 10
,所以我想我做出了正确的算法,,但是当我尝试使用它来更多compli cated矢量像
x<-rpois(100,10)
y<-sample(x,25,replace=F)
my.sample(x,y)
Error in rep(d.data[j, 2], x[j]) : invalid 'times' argument
In addition: There were 21 warnings (use warnings() to see them)
有突发错误和警告21 :(,你们可以给我的手,请通过我在编程新手,所以请帮助我的方式。由于
不知道为什么你保持距离'D'的第一个元素和您提供的结果是正确的'(1,5,5,5,3,10, 10)'。但是,您可以查看向量中的'%in%'操作。例如:像这样的'c(d [1],d [!(d%in%b)])''。 '!'标记周围'(d%in%b)'否定TRUE/FALSE条目,指示d中的特定元素是否存在于b中。我在代码中用'rpois'生成的示例尝试过,它看起来像预期的那样工作。 – 2014-01-29 12:06:41