2016-05-23 9 views
1

Ich habe eine Liste in R:hinzufügen Zeichenelement in zufälligen Positionen auf eine Liste in R

cls <- list(S1 = c("Start", "K1", "K2", "K1", "Buy"), 
     S2 = c("Start", "K1", "K3", "K3", "K2", "Defer"), 
     S3 = c("Start", "K1", "K2", "K2", "K3", "Defer"), 
     S4 = c("Start", "K1", "K3", "K3", "K1", "Defer")) 

Jetzt mag ich „K2“ auf zwei Elemente in einer beliebigen Position zwischen „Start“ und „Kaufen hinzufügen "/"Verschieben".

Mein Ansatz so weit: Wählen Sie Linien, in denen die "K2" hinzuzufügen:

set.seed(1234) 
idx <- sample(4, 2) 
[1] 1 2 

Deshalb möchte ich in den Zeilen 1 und 2. Für die Bestimmung der Position einzufügen, habe ich dieses:

a <- sapply(cls, length) 
set.seed(1234) 
lapply(a, FUN=function(x) x-sample(1:x-1, 1)) 
$`1` 
[1] 4 

$`2` 
[1] 2 

So jetzt habe ich eine Liste, welche Zeilen die Elemente in (1 und 2) und welche Stelle in diesen Zeilen (4 und 2) hinzufügen.

Ich fand insert aus Paket R.utils könnte nützlich sein, aber ich kann nicht herausfinden, wie man es anwenden, ohne eine Schleife zu verwenden. Dieses

x <- insert(cls[[1]], ats=c(4), values="K2") 

arbeitet für das erste Element, das ich einfügen möchte. Wie kann ich die Einfügefunktion auf alle meine Listenelemente anwenden?

Antwort

1

Ich denke, Sie sind fast da - es braucht nur ein wenig Umordnung der Stücke, die Sie bereits haben. Anstatt alle Standorte Abtasten, dann in jeder Orten, die Positionen Abtasten und dann Einsetzen der Probennahme tun und für jeden Ort in einem Schritt Einsetzen:

randinsert <- function(z) { 
    pos <- sample(2:(length(z)-1),size=1) 
    return(R.utils::insert(z,ats=pos, values="K2")) 
} 

Nun lapply() diese Funktion auf den gewählten Positionen:

cls[idx] <- lapply(cls[idx],randinsert) 
Verwandte Themen