2016-08-16 2 views
0

Ich habe eine Lösung, die funktioniert, aber würde Ideen zu schätzen, den Code zu verbessern, um Schleifen zu vermeiden, wenn möglich.Erstellen Master-Liste Hinzufügen von Iterationen von Werten in einer anderen Liste mit bekannten Intervall in R

ich eine Liste von Werten haben, wird diese lesen aus einer CSV-Datei in, aber die Form

startingvalues = c(1, 7, 20, 32, 47) 

Ich möchte eine neue Liste erstellen, die in jedem dieser Startwerte liest und fügt die nächste 2 (oder 7 oder 15 etc.) Zahlen, dann geht es zum nächsten. Für das obige Beispiel wäre das

newlist = c(1,2,3,7,8,9,20,21,22,32,33,34,47,48,49) 

Ich habe Code, der funktioniert, aber ich vermute, dass es eine elegantere Möglichkeit ist, dies zu tun. Ich bin nicht besonders besorgt über die Geschwindigkeit, möchte aber die Schleife vermeiden, wenn es einen besseren Weg dafür gibt.

newlist = c() # initialise an empty list 

for (i in 1:length(startingvalues){ 
list1 = seq(startingvalues[i,1],startingvalues[i,1]+2, by = 1) 
newlist = c(newlist,list1) 
} 

Alle Vorschläge zur Verbesserung meiner Codierung würden geschätzt. Dies könnte der beste Weg sein, dies zu tun, ich vermute jedoch, dass dies nicht der Fall ist.

Antwort

4

Wie wäre es so etwas wie dieses

extend <- function(x,y) unlist(lapply(x, seq.int, length.out=y+1)) 
extend(startingvalues, 2) 
# [1] 1 2 3 7 8 9 20 21 22 32 33 34 47 48 49 

Der erste Parameter ist der Vektor von Zahlen und das zweite ist, wie weit Sie jede Zahl erweitern möchten. Wir haben uns einfach eine lapply für die Iteration genommen und die Sache am Ende aufgehoben. Dies ist besser als das Anhängen bei jeder Iteration, was nicht sehr effizient ist.

Hier ist eine andere alternative

extend <- function(x,y) c(outer(0:y, x, `+`)) 

Die outer() eine Matrix bauen, aber wir zwingen mit c() auf einen Vektor zurück.

+0

Dies funktioniert perfekt, wenn ich Startwerte manuell eingeben (wie ich im obigen Beispiel getan habe), aber ich finde, wenn ich sie aus einem csv mit Startwerten <-read.csv ("startvalues.csv") einliest, tut dies nicht t arbeiten, wie es eine Datafram ist e. Ich habe versucht, as.list (Startwerte) zu verwenden, aber immer noch kein Glück. Ich löste das Problem, indem ich einfach so definierte, wie ich es im Beispiel getan hatte. Ich dachte einfach, ich würde dies notieren, wie ich in der Frage erwähnt habe, die ich von csv gelesen habe. –

+0

Nun, vermutlich hat Ihr data.frame mehrere Spalten. Um den Vektor aus der ersten Spalte zu extrahieren, sollten Sie 'startvalues ​​[[1]]' – MrFlick

3

Wir rep mit + verwenden, um den erwarteten Ausgang

unique(sort(startingvalues + rep(0:2, each = length(startingvalues)))) 
#[1] 1 2 3 7 8 9 20 21 22 32 33 34 47 48 49 

zu erhalten oder als @thelatemail erwähnte den ‚startingvalues‘ replizieren und besser wäre die Verwendung des Recyclings zu machen als sort

s1 <- 0:2 
rep(startingvalues, each=length(s1)) + s1 
#[1] 1 2 3 7 8 9 20 21 22 32 33 34 47 48 49 
vermieden werden kann
+1

verwenden. Es könnte einfacher sein, den anderen Weg zu gehen - 'rep (startvalues, each = 3) + 0: 2' – thelatemail

Verwandte Themen