7

yベクターに別のベクターが含まれているかどうかを確認したいx

y <- c(0,0,0,NA,NA,0)
x <- c(0,0,0,0)

この場合、 にFALSEは 4 つの NULL のシーケンスがないため、返されるはずですy。しかし、 vector を見るとy2、結果は になるはずですTRUE

y2 <- c(0,0,NA,0,0,0,0)

編集

使用しようとしまし%in%たが、ベクトル全体ではなく、ベクトルの要素に対してのみ機能するようです。解決策は、より一般的な問題に適用できる必要はありません。この特定のケースでうまくいくといいですね。

4

8 に答える 8

5

これを使って:

any(apply(embed(y,length(y)-length(x)+1),2,identical,x))
于 2013-09-10T13:25:10.460 に答える
4

疑問に思うかもしれない人のために、答えの時間テスト.

findit1<-function(x,y) any(apply(embed(y,length(y)-length(x)+1),2,identical,x))
findit2<-function(x,y) grepl(paste(x,collapse=";"),paste(y,collapse=";"))

x<-c(0,1,1,0,0,0,1,0,1)
y<-sample(c(0,1),1e5,replace=TRUE)

Rgames> microbenchmark(findit1(x,y),findit2(x,y))
Unit: milliseconds
          expr       min       lq   median       uq      max neval
 findit1(x, y) 403.79291 449.9028 457.8320 466.4996 603.6573   100
 findit2(x, y)  99.09317 100.7774 101.4513 102.1728 119.8970   100

編集:eddiのrle答えを使用して、

Rgames> findit3<-function(x,y) sum(length(x) <= rle(y)$lengths[rle(y)$values %in% 0]) 
Rgames> x<-c(0,0,0,0,0)
Rgames> microbenchmark(findit1(x,y),findit2(x,y),findit3(x,y))
Unit: milliseconds
          expr       min        lq   median        uq       max neval
 findit1(x, y) 340.63570 383.39450 414.6791 456.38786 532.98017   100
 findit2(x, y)  99.72606 101.11308 101.9399 103.20869 117.91149   100
 findit3(x, y)  23.39226  24.39826  31.8478  35.10592  53.15408   100

しかし、どんなシーケンスの一般的な場合でも、xマッサージrleseqleこれを行う方法があるとは思えません. しばらくいろいろ遊びに行かなきゃ。:-)

于 2013-09-10T14:27:49.690 に答える
3

のみの 0 のこの特定のケースでは、次のxように使用しますrle

sum(length(x) <= rle(y2)$lengths[rle(y2)$values %in% 0]) > 0
#[1] TRUE
sum(length(x) <= rle(y)$lengths[rle(y)$values %in% 0]) > 0
#[1] FALSE
于 2013-09-10T15:00:24.763 に答える
1

OPはこれを要求しませんでしたが、インスタンスがx発生する場所を見つける方法は次のとおりです。"9" はy. 明らかに、他のキャラクターを選択できます。

 > bar<-gsub(paste(x,collapse=""),'9',paste(y,collapse=""))
 > rab<-as.numeric(unlist(strsplit(bar,'')))
 > rle(rab==9)
Run Length Encoding
  lengths: int [1:3123] 49 1 49 1 20 1 6 1 78 1 ...
  values : logi [1:3123] FALSE TRUE FALSE TRUE FALSE TRUE ...
于 2013-09-10T17:58:32.777 に答える