我試圖在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