I eine ganze Zahl Vektor a
R: schnellste Weg Vorhandensein jedes Element eines Vektors in jeder der Spalten einer Matrix
a=function(l) as.integer(runif(l,1,600))
a(100)
[1] 414 476 6 58 74 76 45 359 482 340 103 575 494 323 74 347 157 503 385 518 547 192 149 222 152 67 497 588 388 140 457 429 353
[34] 484 91 310 394 122 302 158 405 43 300 439 173 375 218 357 98 196 260 588 499 230 22 369 36 291 221 358 296 206 96 439 423 281
[67] 581 127 178 330 403 91 297 341 280 164 442 114 234 36 257 307 320 307 222 53 327 394 467 480 323 97 109 564 258 2 355 253 596
[100] 215
und eine ganzzahlige Matrix B
B=function(c) matrix(as.integer(runif(5*c,1,600)),nrow=5)
B(10)
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
[1,] 250 411 181 345 4 519 167 395 130 388
[2,] 383 377 555 304 119 317 586 351 136 528
[3,] 238 262 513 476 579 145 461 191 262 302
[4,] 428 467 217 590 50 171 450 189 140 158
[5,] 178 14 31 148 285 365 515 64 166 584
und müssen zu prüfen, Ich möchte eine neue boolesche l x c
Matrix erstellen, die anzeigt, ob jedes Vektorelement in a
in jeder spezifischen Spalte der Matrix B
vorhanden ist oder nicht.
Ich versuchte dies mit
ispresent1 = function (a,B) {
out = outer(a, B, FUN = "==")
apply(out,c(1,3),FUN="any") }
oder mit
ispresent2 = function (a,B) t(sapply(1:length(a), function(i) apply(B,2,function(x) a[[i]] %in% x)))
aber keine dieser Möglichkeiten sehr schnell dies zu tun:
a1=a(1000)
B1=B(20000)
system.time(ispresent1(a1,B1))
user system elapsed
76.63 1.08 77.84
system.time(ispresent2(a1,B1))
user system elapsed
218.10 0.00 230.00
(in meiner Anwendung Matrix B
würde haben etwa 500 000 - 2 Millionen Spalten)
Wahrscheinlich ist das etwas Triviales, aber was ist der richtige Weg dazu?
EDIT: richtige Syntax, wie unten erwähnt, ist ispresent = function (a,B) apply(B,2,function(x) { a %in% x })
, aber die Rcpp
Lösung unten ist immer noch fast 2 mal schneller! Danke dafür!
Sie meinen, in * any * der Spalte von 'B' Matrix vorhanden? Ihre Formulierung verwirrte mich beim Betrachten Ihres Codes. –
Nein, ich meine Präsenz jedes Vektorelements in jeder der Spalten - die "any" im Code wird verwendet, um auf dem 3-dimensionalen Array von außen produziert zu arbeiten. –
Um die Anforderung neu zu formulieren: für jedes Element jeder Spalte von B2 gesetzt TRUE ist der Wert ist in a1, sonst FALSE? (Habe ich Recht oder habe ich den Punkt total verpasst?) – Tensibai