2016-08-18 5 views
1

glaube, ich habe folgende Anordnung:extract „N“ Sortierte-Sequenzen aus einem Array in R

a <- sample(letters,100,replace=TRUE) 

Dann nehme diese Buchstaben in einer Sequenz geordnet sind, ich möchte, aus allen möglichen ‚n‘ großen Sequenzen extrahieren dieses Array. Zum Beispiel:

für n=2 würde ich tun: paste0(a[1:99],"->",a[2:100])

für n=3 ich tun würde: paste0(a[1:98],"->",a[2:99],"->",a[3:100])

Sie erhalten den Punkt. Jetzt ist mein Ziel, eine Funktion zu erstellen, die als Eingabe n nehmen würde und würde mir die entsprechende Menge von Sequenzen der gegebenen Länge aus Array a

Ich konnte es mit Schleifen und alles, aber ich war es tun Ich hoffe auf einen Hochleistungs-Liner.

Ich bin ein bisschen neu zu R, so dass ich nicht alle vorhandenen Funktionen kenne.

+3

Versuchen Sie 'embed (a, n)' ... obskure Funktion mit einem seltsamen Namen, aber scheint genau das zu tun. – Frank

+0

@Frank Ich dachte, es funktionierte zunächst nicht, aber dann las ich die Ausgabe beginnend mit der letzten Spalte und es war korrekt, ich muss nur herausfinden, wie man jede Zeile beginnend von der letzten bis zur ersten Spalte zusammenstellt in ein Array – Imlerith

+0

Sie können die Reihenfolge der Spalten danach umkehren, wie 'Embed (a, n) [, n: 1]' – Frank

Antwort

3

Sie können embed verwenden. Für embed(a, 3) ergibt sich eine Matrix mit Spalten

  • a[3:100]
  • a[2:99]
  • a[1:98]

in dieser Reihenfolge.

die Spaltenreihenfolge Verwendung Matrix Syntax m[rows, cols] Zum Umkehren:

res = embed(a, 3)[, 3:1] 

Wenn Sie Pfeile zwischen den Spalten gedruckt, dann

do.call(paste, c(split(res, col(res)), sep = " -> ")) 

ist eine Möglichkeit. Dies ist wahrscheinlich besser als apply(res, 1, something), leistungsmäßig, da dies vektorisiert ist, während apply Schleifen über Zeilen würde.

library(data.table) 
do.call(paste, c(shift(a, 2:0), sep = " -> "))[-(1:2)] 

shift ist wie embed, außer es ...

  • gibt eine Liste:


    Wie @DavidArenburg wies darauf hin, das in ähnlicher Weise mit data.table getan werden kann, anstelle einer matrix, so müssen wir nicht split von col einfügen

  • pads mit mis singen Werte über die volle Länge zu halten, so müssen wir mit -(1:2)

Ich habe gehofft, zu sagen, etwas Nützliches fallen, wie obskure Funktionen in R zu finden, kamen aber meist leer, wie embed sein könnte gefunden. Könnte sein...

  1. Zum beliebigen HTML-Hilfeseite
  2. der "Index" Hyperlink am unteren
  3. Klicken Sie auf jede einzelne Seite

lesen?

+0

Dank @David, hinzugefügt – Frank