2016-10-21 5 views
0

Ich möchte eine Funktion schreiben, die n Stichproben eines Datensatzes ohne Ersatz erstellt.R: Warum erstellt meine Funktion keine Objekte in meiner Umgebung?

In diesem Beispiel verwende ich den Iris-Datensatz. Die Iris-Datensatz hat 150 Beobachtungen und sagen, ich will 10 Proben.

Mein Versuch:

#load libraries 
library(dplyr)  

# load the data 
data(iris) 
head(iris) 

# name df 
df = iris 

# set the number of samples 
n = 10 

# assumption: the number of observations in df is divisible by n 
# set the number of observations in each sample 
m = nrow(df)/n 

# create a column called row to contain initial row index 
df$row = rownames(df) 

# define the for loop 
# that creates n separate data sets 
# with m number of rows in each data set 

for(i in 1:n){ 
    # create the sample 
    sample = sample_n(df, m, replace = FALSE) 

    # name the sample 'dsi' 
    x = assign(paste("ds",i,sep=""),sample) 

    # remove 'dsi' from df 
    df = df[!(df$row %in% x$row),] 

} 

Wenn ich diesen Code ausführen ich bekommen, was ich will. Ich bekomme die Stichproben mit den Namen ds1, ds2, ..., ds10.

Jetzt, wenn ich versuche, es in eine Funktion zu aktivieren:

samplez <- function(df,n){ 

    df$row = rownames(df) 

    m = nrow(df)/n 

    for(i in 1:n){ 

    sample = sample_n(df, m, replace = FALSE) 

    x = assign(paste("ds",i,sep=""),sample) 

    df = df[!(df$row %in% x$row),] 

    } 

} 

Nichts passiert, wenn ich 'samplez (Iris, 10)' ausführen. Was vermisse ich?

Dank

+1

Ihre Funktion wird einen Wert nicht zurück, wenn Sie nicht ausdrücklich eine Rückkehr. Fügen Sie beispielsweise zwischen den letzten beiden geschweiften Klammern "df" hinzu, um "df" an die übergeordnete Umgebung zurückzugeben. – eipi10

+0

@ eipi10 true, weißt du, wie meine Proben in der Umgebung erscheinen? – Zyferion

+0

Sie meinen, Sie wollen nicht nur 'df', sondern auch den Wert von' sample' für jede Iteration der Schleife zurückgeben? "X = assign (paste (" ds ", i, sep =" "), sample) ist übrigens nicht nötig". Dies entspricht "x = sample". Aber das ist auch nicht nötig, denn Sie können 'df = df [! (Df $ row% in% sample $ row)]'. – eipi10

Antwort

3

Sie die Ergebnisse in einer Liste speichern und darauf zurückkommen. Dann haben Sie ein einzelnes Objekt, die Liste der Beispiele, in Ihrer globalen Umgebung, anstatt Ihre Umgebung mit einer Menge ähnlicher Datenrahmen zu überladen.

Ich bin mir nicht sicher, was Sie mit df zu tun versuchen, aber hier ist, wie Sie alle Proben zurückgeben. Lassen Sie mich wissen, was Sie mit df tun möchten und ich kann hinzufügen, dass auch:

samplez <- function(df,n){ 

    samples = list() 

    df$row = rownames(df) 

    m = nrow(df)/n 

    for(i in 1:n){ 

    samples[[paste0("ds",i)]] = sample_n(df, m, replace = FALSE) 

    df = df[!(df$row %in% samples[[i]]$row),] 

    } 
    return(samples) 
} 
+0

Yay danke, genau das, was ich brauchte. Ich habe Listen vergessen. – Zyferion

Verwandte Themen