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