2017-12-31 41 views
2

Ich versuche, diesen Datenrahmen durch vordefinierte Zeilennummern zu unterteilen.Daten aufteilen, um Zug- und Testsätze zu erstellen - for loop - Variable in Teilmenge nach Zeile einfügen

 # Make dummy data frame 
df <- data.frame(data=1:200) 
     train.length <- 1:2 

# Set pre determined row numbers for subsetting 
train.length.1 = 1:50 
test.length.1 = 50:100 
train.length.2 = 50:100 
test.length.2 = 100:150 

train.list <- list() 
test.list <- list() 
# Loop for subsetting by row, using row numbers in variables above 
for (i in 1:length(train.length)) { 
    # subset by row number, each row number in variables train.length.1,2etc.. 
    train.list[[i]] <- df[train.length.[i],] # need to place the variable train.length.n here... 
    test.list[[i]] <- df[test.length.[i],] # place test.length.n variable here.. 
    # save outcome to lists 
} 

Meine Frage ist, wenn ich meine Zeilennummern in einer Variablen gespeichert haben, wie ich platziere jeweils [it] eine innerhalb der subsetting Code?

Ich habe versucht:

df[train.length.[i],] 

auch

df[paste0"train.length.",[i],] 

jedoch, dass Pasten als Charakter und es tut mir train.length.n Variable ... wie unten

> train.list[[i]] <- df[c(paste0("train.length.",train.length[i])),] 
> train.list 
[[1]] 
    data data1 
NA NA NA 
lesen

Wenn ich die Variable dort selbst habe, funktioniert es wie beabsichtigt. Nur müssen sie für Schleife

gewünschte Ausgabe in einem arbeiten -

train.set.output.1 <- df[train.length.1,] 
test.set.output.1 <- df[test.length.1,] 
train.set.output.2 <- df[train.length.2,] 
test.set.output.2 <- df[test.length.2,] 

ich dies manuell die unten drucken tun können, aber seine cumersome für viele Zug/Test-Sets ... damit für Schleife

+1

'? Caret :: createTimeSlices' – alistaire

+0

Gutes Beispiel hier http://topepo.github.io/caret/data-splitting.html –

+0

Wird es den gesamten Datenrahmen subsettieren? –

Antwort

1

Betrachten Sie gestaffelt seq() und übergeben Sie die Zahlenfolgen in lapply, um nach Zeilen zu schneiden. Auch für gleich lange Datenrahmen, die Sie wahrscheinlich beginnt soll bei 1, 51, 101, ...

train_num_set <- seq(1, 200, by=50) 
train.list <- lapply(train_num_set, function(i) df[c(i:(i+49)),]) 

test_num_set <- seq(51, 200, by=50) 
test.list <- lapply(test_num_set, function(i) df[c(i:(i+49)),]) 
+0

Dies entspricht dem Beispiel, im wirklichen Leben brauche ich Zugsreihen, die 252 Reihen lang sind, mit Testsätzen 126. Es gibt keine Möglichkeit, dass ich die Methode arbeite, die ich in meinem Beispiel versuche? Verwenden Sie eine Variable innerhalb der Teilmenge, um es für die Schleife zu tun? –

+0

Das funktioniert wie vorgesehen! Vielen Dank! –

1

eine Funktion erstellen, die Ihren Datenrahmen teilt sich in verschiedene Stücke:

split_frame_by_chunks <- function(data_frame, chunk_size) { 
    n <- nrow(data_frame) 
    r <- rep(1:ceiling(n/chunk_size),each=chunk_size)[1:n] 
    sub_frames <- split(data_frame,r) 
    return(sub_frames) 
} 

Rufen Sie Ihre Funktion mit dem Datenrahmen und der Chunk-Größe auf. In Ihrem Fall sind Sie Ihre Datenrahmen in Stücke von 50 Aufspalten:

chunked_frames <- split_frame_by_chunks(data_frame, 50) 

Entscheiden Anzahl der Zug/Test teilt sich in der Schleife erstellen

num_splits <- 2 

Erstellen Sie den entsprechenden Zug und Testreihen innerhalb Ihrer Schleife. In diesem Fall erstelle ich die 2, die du in deiner Frage gezeigt hast. (Das heißt die erste Schleife erzeugt einen Zug und Test-Set mit Reihen 1-50 und 50-100 respectively):

for(i in 1:num_splits) { 
    this_train <- chunked_frames[i] 
    this_test <- chunked_frames[i+1] 
} 

Genau das tun, was auch immer Sie brauchen, um das dynamisch erstellt Zug und Test-Frames innerhalb der Schleife.

Verwandte Themen