2017-02-05 3 views
2

Angenommen, wir haben einen Vektor v <- 1:3, aus dem wir einen Datenrahmen mit 5 Zeilen generieren möchten, indem wir die sample-Funktion auf v anwenden. Die erwarteten Ergebnisse sollten in etwa so aussehen:Erstellen eines Datenrahmens aus Stichproben eines Vektors

X1 X2 X3 
1 3 2 
2 3 1 
3 1 2 
2 1 3 
3 2 1 

Hinweis: Es ist nicht wichtig, ob einige Zeilen dupliziert werden. Ich würde eine Lösung bevorzugen, die keinen Forloop erfordert.

Antwort

3
v = 1:3 
data.frame(matrix(sample(v, 5*length(v), replace = T), nrow = 5, ncol = length(v))) 
# X1 X2 X3 
#1 3 3 1 
#2 1 1 3 
#3 3 3 1 
#4 2 2 1 
#5 3 1 2 

# else 
data.frame(t(replicate(5, sample(v, length(v), replace = F)))) 
# else 
data.frame(t(sapply(1:5, function(x) sample(v, length(v), replace = F)))) 
+0

Dies liegt in der Nähe der Lösung, aber ich will nicht repliziert Werte * innerhalb * je Reihen. Doppelte Zeilen sind in Ordnung. – mat

+0

@mat etwas wie 'data.frame (t (sapply (1: 5, Funktion (x) Probe (v, Länge (v), ersetzen = F))))'? –

+0

Ja, das funktioniert! – mat

3

Ich denke, pryr ‚s %<a-% Betreiber für diese groß ist. %<a-% speichert einen Ausdruck in einer Variablen, aber jedes Mal, wenn die Variable ausgewertet wird, wird der Ausdruck erneut ausgeführt. Perfekt für die Probenahme:

library(pryr) 
#the function sample will be rerun each time sampled is evaluated 
sampled %<a-% sample(v) 

#replicate just replicates an expression 
#t pivots the matrix, so that you get the output you want 
data.frame(t(replicate(5, sampled))) 

#or simply (since the edit makes it simpler) 
#data.frame(t(replicate(5, sample(v)))) 

Ausgang:

X1 X2 X3 
1 3 1 2 
2 2 1 3 
3 1 3 2 
4 2 3 1 
5 2 3 1 
+0

Das ist nah an der Lösung, aber ich möchte keine replizierten Werte * innerhalb * jeder Zeile. Doppelte Zeilen sind in Ordnung. – mat

+0

Sorry, habe das anfangs nicht verstanden. Ich habe meine Antwort aktualisiert, um die von Ihnen benötigte Ausgabe wiederzugeben. – LyzandeR

0
dfV <- data.frame(v1 = sample(v, 5,replace = TRUE), v2 = sample(v, 5, replace = TRUE), v3 = sample(v, 5, replace = TRUE)) 
+0

Vielen Dank für Ihre Antwort aber stellen Sie sich vor, wenn ich dies für 1000 Zeilen tun muss? Das wäre nicht sehr praktisch ... – mat

Verwandte Themen