2016-03-19 5 views
2

Ich habe einen großen Datenrahmen, wo eine Variable ID (erste Spalte) mit verschiedenen Werten in der zweiten Spalte wiederkehrt. Meine Idee ist, den Datenrahmen zu ordnen, ihn in eine Liste aufzuteilen und dann eine Funktion zu plat- zieren, die die Sequenz 1: nrows (variable id) an jede Gruppe bindet. Mein Code so weit:cbind 1: nrows der gleichen ID Variablenwert zu ursprünglichen data.frame

DF <- DF[order(DF[,1]),] 
DF <- split(DF,DF[,1]) 
DF <- lapply(1:length(DF), function(i) cbind(DF[[i]], 1:length(DF[[i]]))) 

Aber das gibt mir einen Fehler: Argumente implizieren unterschiedliche Anzahl von Zeilen.

Können Sie es ausarbeiten?

> head(DF, n=50) 
    cell  area 
1  1 121.2130 
2  2 81.3555 
3  3 81.5862 
4  4 83.6345 
... 
33 1 121.3270 
34 2 80.7832 
35 3 81.1816 
36 4 83.3340 

DF <- DF[order(DF$cell),] 

Was ich will, ist:

> head(DF, n=50) 
    cell area counter 
1  1 121.213 1 
33  1 121.327 2 
65  1 122.171 3 
97  1 122.913 4 
129  1 123.697 5 
161  1 124.474 6 

... und so weiter.

Dies ist mein Code:

cell.areas.t <- function(file) { 

    dat = paste(file) 

    DF <- read.table(dat, col.names = c("cell","area")) 
    DF <- splitstackshape::getanID(DF, "cell")[] # thanks to akrun's answer 


    ggplot2::ggplot(data = DF, aes(x = .id , y = area, color = cell)) +  
     geom_line(aes(group = cell)) + geom_point(size=0.1) 
} 

Und die Handlung sieht wie folgt aus:

cell.areas over time

Die meisten Zellen in Bereich zu erhöhen, nur etwas zu verringern. Dies ist nur ein erster Versuch, meine Daten zu visualisieren. Was Sie also nicht gut sehen können, ist, dass die Bereiche aufgrund der Zellteilung periodisch ausfallen.

Zusätzliche Frage:

Es ist ein Problem, das ich vorher nicht berücksichtigt hätte, die nach einer Zellteilung wird eine neue Zelle 1 mit dem data.frame hinzugefügt und reichten den ursprünglichen Index ist, dass (Sie sehen in dem Bild, dass alle Zellen von .id = 1 beginnen, nicht später), was nicht das ist, was ich will - es muss den Index seiner Erstellungszeit erben. Das erste, was mir in den Sinn kommt, ist, dass ich einen Parsing-Mechanismus verwenden könnte, die diesen Job für eine neu hinzugefügte Zelle Variable tut:

DF$.id[DF$cell != temporary.cellindex] <- max(DF$.id[DF$cell != temporary.cellindex]) 

Haben Sie eine bessere Idee? Vielen Dank.

Es gibt eine Randbedingung, die das Problem erleichtern kann: feste Anzahl von Zellen am Anfang (32). Eine andere Lösung wäre, alle Daten wegzuschneiden, bevor die letzte Tochterzelle erzeugt wird.

Update: Zusätzliche Frage gelöst, hier ist der Code:

cell.areas.t <- function(file) { 
    dat = paste(file) 
    DF <- read.table(dat, col.names = c("cell","area")) 
    DF$.id <- c(0, cumsum(diff(DF$cell) < 0)) + 1L # Indexing 

    title <- getwd() 

    myplot <- ggplot2::ggplot(data = DF, aes(x = .id , y = area, color = factor(cell))) + 
     geom_line(aes(group = cell)) + geom_line(size=0.1) + theme(legend.position="none") + ggtitle(title) 

    #save the plot 
    image=myplot 
    ggsave(file="cell_areas_time.svg", plot=image, width=10, height=8) 

} 

Antwort

0

Wir getanID von splitstackshape

library(splitstackshape) 
getanID(DF, "cell")[] 
+1

Auch sehr nett! 'DF <- splitstapshape :: getanID (DF," Zelle ") []' gibt mir eine zusätzliche Spalte namens '.id' –

0

Es gibt eine viel einfachere Methode, um dieses Ziel zu erreichen. Verwenden Sie ave mit seq.int

DF$group_seq <- ave(DF, DF[,1], FUN=function(x){ seq.int(nrow(x)) }) 
+0

Dies ist ideal nutzen können! Vielen Dank! Gibt mir eigentlich zwei zusätzliche Spalten ('group_seq.cell',' group_seq.area'), aber das ist kein großes Problem. –