2016-08-13 1 views
0

Ich möchte einen Datenrahmen mit einer zufälligen Länge erzeugen.Generiere Datenrahmenlänge (und Spaltendaten) von der Funktion

> head(df) 
"id" "age" 
53  12  # randomly chosen data from fn1(){} and fn2(){} 
146  31  # 
343  22  # 
...#randomly generated length from sample(50:5000,1) 

Das Problem ist, dass die Art, wie ich versucht habe, ist nur das gleiche Element immer und immer wiederholen:

# This just repeats the same value instead of generating function over and over 
a <- fn1(){} 
rep(a,15) 
[1] "S" "S" "S" "S" "S" "S" "S" ... 

in idealer Weise der Spaltennamen Ich mag einen Wert von anderen Funktionen spezifizieren und vergeben:

# Generate length of data frame 
df.length <- sample(50:500,1) 

# Generate data for each row from function 
df.column.id <- fn1(){} 
df.column.age <- fn2(){} 
... 

df <- data.frame("id" = df.column.id, "age" = df.column.age, ...) 

Leider funktioniert die Rep-Funktion nicht, also wie können die Datenrahmenspalten aus Funktionen generiert werden? Ich habe auch versucht matrix(data = c(df.column.id, df.column.age), nrow = df.length) nicht wie vorgesehen funktioniert.

Edit:

replicate (10, RandomStatusColor(), vereinfachen = "Vektor") arbeitet, einen Vektor der Funktionsausgänge zu erzeugen.

+0

cbind (col1 = replizieren (10, RandomStatusColor(), simplify = "vector"), col2 = .... ist was ich wollte – jrzelling

Antwort

1

Vielleicht könnte so etwas wie dies helfen:

min_rownum <- 10 
max_rownum <- 50 
num_of_rows <- sample(seq(min_rownum, max_rownum), 1) 
min_age <- 1 
max_age <- 50 
age <- sample(seq(min_age, max_age), num_of_rows, replace = TRUE) 
min_ID <- 50 
max_ID <- 500 
id <- sample(seq(min_ID, max_ID), num_of_rows) 
df1 <- data.frame(id, age) 

Ich habe versucht, Variablennamen zu verwenden, die der Code selbsterklärend machen würde. Der Parameter replace = TRUE in der Funktion sample() bedeutet, dass ein Element mehrfach ausgewählt werden kann. Im Alter ist dies plausibel, während IDs einzigartig sein sollten. Das zweite Argument von sample() definiert, wie viele Elemente aus dem Vektor ausgewählt werden sollen, der als erstes Argument übergeben wird.


Der Titel der Frage schlägt vor, dass der data.frame von einer Funktion generiert werden sollte. In diesem Fall kann der obige Code in eine Funktion wie diese gewickelt werden:

make_random_df <- function(min_rownum=10, max_rownum=50, min_age=1, max_age=50, 
         min_ID=50, max_ID=500) { 
    num_of_rows <- sample(seq(min_rownum, max_rownum), 1) 
    age <- sample(seq(min_age, max_age), num_of_rows, replace = TRUE) 
    id <- sample(seq(min_ID, max_ID), num_of_rows) 
    df1 <- data.frame(id, age) 
} 

Mit Hilfe dieser Funktion kann der data.frame mit

my_random_df <- make_random_df() 
#> head(my_random_df) 
# id age 
#1 461 7 
#2 86 44 
#3 319 8 
#4 363 45 
#5 59 3 
#6 258 49 
1

Hier erstellt werden ist eine Funktion, die Abtastdaten eines erzeugt vorgegebene Länge (len) von einem bestimmten Vektor (vec):

createData <- function(vec, len) { 
    sample(vec, len, replace = TRUE) 
} 

nobs <- 20 

df <- data.frame(id = createData(vec = c("a", "b", "c"), len = nobs), 
       age = createData(vec = seq(10, 50, 10), len = nobs)) 

df 

Ist das, was Sie nach?

+0

'createData' sollte skalieren solange Ihre' fn() 'zurückgeben ein Vektor wie 'c' und' seq' im Beispiel Kannst du uns einen deiner 'fn()' s zeigen? – TimSalabim