2016-08-17 3 views
0

I-Daten haben, die so aussieht (aber größer):R: Splitting-Datensatz durch vorgegebene Werte

Pos Value 
    0 66.81967 
    1 66.36885 
    2 65.79508 
    3 65.27049 
    4 64.88525 
    5 64.97541 
    6 65.39344 
    7 65.99181 
    8 66.63115 
    9 66.95901 
    10 66.89344 
    11 66.44262 
    12 65.90984 
    13 65.49181 
    14 65.35246 

Ich habe bereits die Maxima ermittelt und gespeichert werden die Positionswerte der einzelnen zu einem Vektor wie folgt:

9 19 30 42 56 69 80 92 107 118 130 143 154 164 176 188 199 211 
222 234 245 

ich die Daten wollen basierend auf dem Wert der Maxima jetzt spalten, so dass für die Beispieldaten I den Datensatz in die Werte für Positionen wollen würde für Positionen 0-> 9 und in die Werte spalten 10-15, und speichern Sie jede dieser Untermengen in eigene Vektoren.

Ich bin neu in R (und Codierung) und fragte mich, wie man das am besten angeht.

+1

Warum '10-15'? Ist es nicht "10-19"? – user2100721

+0

Ich sagte 10-15, weil ich die Daten nur bis Wert 15 zur Verfügung gestellt habe (oder besser gesagt, ich dachte, ich hätte. Ich merke jetzt, dass ich nur bis zu 14 angegeben habe). – GeorgeSBF

Antwort

1

Angenommen, Ihr Datenrahmen dat und Ihre Maxima Werte sind in ein Vektor maxima, könnten Sie

split(dat, cut(dat$Pos, breaks = maxima, include.lowest = TRUE)) 

Für die Beispieldatenrahmen verwenden:

dat <- 
structure(list(Pos = 0:14, Value = c(66.81967, 66.36885, 65.79508, 
65.27049, 64.88525, 64.97541, 65.39344, 65.99181, 66.63115, 66.95901, 
66.89344, 66.44262, 65.90984, 65.49181, 65.35246)), .Names = c("Pos", 
"Value"), class = "data.frame", row.names = c(NA, -15L)) 

und die ersten paar Werte Ihrer Maxima im Bereich:

maxima <- c(0, 10, 19) 

mein Code, den Sie eine Liste von Daten gibt Rahmen

#$`[0,10]` 
# Pos Value 
#1 0 66.81967 
#2 1 66.36885 
#3 2 65.79508 
#4 3 65.27049 
#5 4 64.88525 
#6 5 64.97541 
#7 6 65.39344 
#8 7 65.99181 
#9 8 66.63115 
#10 9 66.95901 
#11 10 66.89344 
# 
#$`(10,19]` 
# Pos Value 
#12 11 66.44262 
#13 12 65.90984 
#14 13 65.49181 
#15 14 65.35246 

Wenn Sie keine Datenrahmen wollen, aber nur Value verwenden

split(dat$Value, cut(dat$Pos, breaks = maxima, include.lowest = TRUE)) 

#$`[0,10]` 
# [1] 66.81967 66.36885 65.79508 65.27049 64.88525 64.97541 65.39344 65.99181 
# [9] 66.63115 66.95901 66.89344 
# 
#$`(10,19]` 
# [1] 66.44262 65.90984 65.49181 65.35246 

Danke! Wie würde ich diese als separate Datenrahmen/-sätze speichern (nicht sicher in der richtigen Terminologie), damit ich sie dann individuell anpassen kann?

Wie wäre es

lst <- split(dat, cut(dat$Pos, breaks = maxima, include.lowest = TRUE)) 
dir <- getwd() 
lapply(seq_len(length(lst)), 
     function (i) write.csv(lst[[i]], file = paste0(dir,"/",names(lst[i]), ".csv"), row.names = FALSE)) 

Diese dir jeden Datenrahmen in eine .csv Datei unter Verzeichnis speichert. Ich habe getwd() verwendet, um den Code zu testen; Sie können es in einen bestimmten Ordner ändern.

+0

Danke! Wie würde ich diese als separate Datenrahmen/-sätze speichern (nicht sicher in der richtigen Terminologie), damit ich sie dann individuell anpassen kann? – GeorgeSBF

+0

Nochmals vielen Dank! Ich habe die Antwort akzeptiert. Eine letzte Sache jedoch - wenn ich diesen Code ausführe, werden nur die Sektionen von der zweiten Partition gespeichert, d. H. Die erste Partition (0-10) wird nicht als .csv gespeichert. Weißt du, warum das so sein könnte? – GeorgeSBF

1

nicht sicher, ob das der beste Ansatz ist, aber ich würde mit einer Liste arbeiten und wie dieser für Schleife verwenden (nicht getestet):

maxpos <- c(9, 19, 30) 
ans <- list() 
prev <- 1 
for (i in seq.int(length(maxpos))) { 
    ans[[i]] <- dataset[seq(prev, maxpos[i]),] 
    prev <- maxpos[i+1] 
} 
ans[[length(maxpos)+1]] <- dataset[seq(maxpos[length[maxpos]]+1,nrow(dataset)),]