2016-05-24 14 views
1

Ich möchte 5 zufällige Zeilen 1000 mal probieren und sie in einem Datenrahmen zusammenfassen. Ich habe ein Problem mit der replace = FALSE und ich frage mich, wo man es auf replace = TRUE setzen kann.R replizieren Probe Funktion ohne Ersatz

Ich habe einen Datensatz von 5000 Zeilen, die (vereinfacht) wie folgt aussieht:

Fund.ID Vintage Type Region.Focus Net.Multiple Size 
[1,] 4716 2003 2 US   1.02   Small 
[2,] 2237 1998 25 Europe  0.03   Medium 
[3,] 1110 1992 2 Europe  1.84   Medium 
[4,] 12122 1997 25 Asia   2.04   Large 
[5,] 5721 2006 25 US   0.86   Mega 
[6,] 730 1998 2 Europe  0.97   Small 

Diese meine Funktion ist, die mit einer zufälligen Reihe beginnt und schließt eine Einschränkung für die 5 Reihen gezogen werden .:

 simulate <- function(inv.period) { 
      start <- sample_n(dataset, 1, replace=TRUE) #draw random first fund 
      t <- start$Vintage:(start$Vintage + inv.period) #define investment period contingent on first fund 
      fof <- dataset[sample(which(dataset$Vintage %in% t), 5, replace = FALSE), ] #include constraint, 5 funds in portfolio 
     } 

#replicate this function 1,000 times 
#and give out as a data frame with portfolios classified 
     library(plyr) 
     library(dplyr) 
     fof.5 <- rdply(1000, simulate(4)) 
     rename(fof.5, FoF.ID = .n) 

Wenn ich ersetzen verwenden = FALSE in der simulieren-Funktion (nach fof < -), bekomme ich diesen Fehler:

Error in sample.int(length(x), size, replace, prob) : 
    cannot take a sample larger than the population when 'replace = FALSE' 

Der ganze Ausdruck funktioniert, wenn ich ersetzen = TRUE. Dies wäre jedoch nicht korrekt, da eine Zeile im selben Beispiel doppelt gezeichnet werden könnte, was ich nicht möchte.

Gibt es eine Möglichkeit, replace = FALSE zu setzen, wenn Zeilen gezeichnet werden, aber replace = TRUE für den gesamten Datensatz? Es sollte sein: Eine Zeile kann nur einmal innerhalb der Probe gezeichnet werden, kann aber in einer anderen Probe ein anderes Mal gezogen werden.

+0

Wenn Sie eine Funktion aus einem Paket verwenden geben Sie bitte mit 'library (package)' hilft anderen, Ihren Code zu replizieren und Lösungen zu finden. –

+0

Die Funktion 'simulate' gibt keinen Wert zurück. Es wird auch jedes Mal fehlschlagen, wenn die Länge von "t" kleiner als "5" ist. Zum Beispiel, sagen wir, "Start" gibt Zeile 4 aus seinem Beispiel zurück. Dann wird "start $ Vintage" '1997' sein. Nehmen wir an, dass "inv.period" 1 ist. Es werden zwei Werte abgetastet, die Zeilen 2 und 4. Sie verlangen, dass 5 Werte ersatzlos extrahiert werden. Das ergibt keinen Sinn. –

+0

Ich benutze die plyr und dplyr Pakete, wie in der zweiten Code Box angegeben. Es stimmt, dass meine Simulationsfunktion keinen Wert zurückgibt. Das liegt daran, dass ich die replizierte Funktionsausgabe als einen Datenrahmen mit der rdply-Funktion speichere. Da ich einen großen Datensatz (5.000 Zeilen) mit Jahren 1982-2015 habe, sollte Ihr zweiter Punkt nicht zu Problemen führen. – Toto

Antwort

0

Ich würde vorschlagen, die dplyr Sachen herauszunehmen, gibt es keine Notwendigkeit dafür. Zweitens, fügen Sie eine Variable für die Übereinstimmungen mit dem Namen matches hinzu, um dann die Länge dieses Vektors oder die Zahl 5 abzutasten, je nachdem, welcher Wert kleiner ist. Schließlich würde ich data.table::rbindlist verwenden, es hat ein Argument, um einen Index zu erstellen, der angibt, welche Zeichnung gezogen wurde. Der Ausgang wird ein data.table sein, wenn Sie nicht mit ihm vertraut sind, Sie as.data.frame(rbindlist(....)) am Ende verwenden, kann es zu einem data.frame .: zurück zu drehen

library(data.table) 
simulate <- function(inv.period) { 
    start <- dataset[sample(nrow(dataset), 1, replace=TRUE),] 
    t <- start$Vintage:(start$Vintage + inv.period) 
    matches <- which(dataset$Vintage %in% t) 
    dataset[sample(matches, min(length(matches),5), replace = FALSE), ] 
} 

r <- replicate(1000, simulate(5), simplify=FALSE) 
rbindlist(r, idcol="draw") 
+0

Vielen Dank! Das funktioniert perfekt. Ich habe am Ende den Ausdruck as.data.frame() hinzugefügt und jetzt habe ich einen Datenrahmen genau so, wie ich es wollte. – Toto

+0

Wenn ich die Funktion z. Für eine Investitionsperiode von 5 Jahren und 15, 25, 30 oder sogar 100 Zeilen in der Stichprobe funktioniert die Funktion nicht richtig: Einige Stichproben haben weniger als die angegebene Anzahl von Reihen (z. B. 2 statt 50), während andere Stichproben haben die angegebene Anzahl von Zeilen. Ich bin mir bewusst, dass dies auf eine begrenzte Anzahl von Zeilen zurückzuführen ist, die ich seit einigen Jahren habe (und dieser Start ist unbeschränkt). Wie kann ich dieses Problem lösen? Könnte ich irgendwie schon Einschränkungen in die erste Startprobe legen? – Toto

+0

Sie können nicht extrahieren, was nicht da ist. Es gibt keinen Code, um mehr Daten für Sie zu erstellen, Sie müssen mit dem arbeiten, was Sie haben. –