Ändern der Form von Datenrahmen in R [Duplizieren]
Frage
Diese Frage bereits eine Antwort hier:
- Wie Daten neu zu gestalten von lang auf Großformat 11 Antworten
Ich laufe in Schwierigkeiten eine große Datenrahmen Umformung. Und ich habe relativ glücklich gewesen in der Vergangenheit Probleme bei der Vermeidung von Umformung, was auch bedeutet, ich bin schrecklich es.
Meine aktuellen Datenrahmen sieht etwa so aus:
unique_id seq response detailed.name treatment
a N1 123.23 descr. of N1 T1
a N2 231.12 descr. of N2 T1
a N3 231.23 descr. of N3 T1
...
b N1 343.23 descr. of N1 T2
b N2 281.13 descr. of N2 T2
b N3 901.23 descr. of N3 T2
...
Und ich möchte:
seq detailed.name T1 T2
N1 descr. of N1 123.23 343.23
N2 descr. of N2 231.12 281.13
N3 descr. of N3 231.23 901.23
Ich habe in das reshape Paket sehe, aber ich bin nicht sicher, wie ich die Behandlung Faktoren in einzelne Spaltennamen umwandeln kann.
Danke!
Edit: Ich habe versucht, diese auf meinem lokalen Rechner ausgeführt wird (4 GB Dual-Core iMac 3,06 GHz) und es hält sich nicht an:
> d.tmp.2 <- cast(d.tmp, `SEQ_ID` + `GENE_INFO` ~ treatments)
Aggregation requires fun.aggregate: length used as default
R(5751) malloc: *** mmap(size=647168) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
Ich werde versuchen, dies unsere größeren Maschinen auf einem laufen, wenn ich eine Chance bekommen.
Lösung
reshape scheint immer schwierig zu mir, aber es scheint immer an der Arbeit mit einem kleinen Versuch und Irrtum. Hier ist, was ich am Ende Befund:
> x
unique_id seq response detailed.name treatment
1 a N1 123.23 dN1 T1
2 a N2 231.12 dN2 T1
3 a N3 231.23 dN3 T1
4 b N1 343.23 dN1 T2
5 b N2 281.13 dN2 T2
6 b N3 901.23 dN3 T2
> x2 <- melt(x, c("seq", "detailed.name", "treatment"), "response")
> x2
seq detailed.name treatment variable value
1 N1 dN1 T1 response 123.23
2 N2 dN2 T1 response 231.12
3 N3 dN3 T1 response 231.23
4 N1 dN1 T2 response 343.23
5 N2 dN2 T2 response 281.13
6 N3 dN3 T2 response 901.23
> cast(x2, seq + detailed.name ~ treatment)
seq detailed.name T1 T2
1 N1 dN1 123.23 343.23
2 N2 dN2 231.12 281.13
3 N3 dN3 231.23 901.23
Ihre ursprünglichen Daten waren bereits in Langform, aber nicht im Langformat, das / cast Anwendungen schmelzen. Also habe ich es wieder geschmolzen. Das zweite Argument (id.vars) ist die Liste der Dinge nicht zu schmelzen. Das dritte Argument (measure.vars) ist die Liste der Dinge, die sich ändern.
Dann verwendet die Besetzung eine Formel. Links von der Tilde sind die Dinge, die bleiben, wie sie sind, und rechts neben der Tilde sind die Säulen, die den Wert Spalte verwendet werden, um zu konditionieren.
Mehr oder weniger ...!
Andere Tipps
Aufbauend auf Harlans Antwort -. Das Umschmelzen Schritt vermieden werden kann, wenn die Daten bereits im Langformat ist, und die Spaltenwerte halten, werden in dem cast
Aufruf angegeben
> x <- read.table(textConnection(" unique_id seq response detailed.name treatment
+ 1 a N1 123.23 dN1 T1
+ 2 a N2 231.12 dN2 T1
+ 3 a N3 231.23 dN3 T1
+ 4 b N1 343.23 dN1 T2
+ 5 b N2 281.13 dN2 T2
+ 6 b N3 901.23 dN3 T2"))
>
> cast(x, seq + detailed.name ~ treatment, value = "response")
seq detailed.name T1 T2
1 N1 dN1 123.23 343.23
2 N2 dN2 231.12 281.13
3 N3 dN3 231.23 901.23
Eine weitere Möglichkeit zur Verwendung von spread
tidyr
würde
library(tidyr)
Wide1 <- spread(x[-1], treatment, response)
Wide1
# seq detailed.name T1 T2
#1 N1 dN1 123.23 343.23
#2 N2 dN2 231.12 281.13
#3 N3 dN3 231.23 901.23
Die entgegengesetzte Wirkung wird durch gather
gather(Wide1, detailed.name, response, T1:T2)
# seq detailed.name detailed.name response
#1 N1 dN1 T1 123.23
#2 N2 dN2 T1 231.12
#3 N3 dN3 T1 231.23
#4 N1 dN1 T2 343.23
#5 N2 dN2 T2 281.13
#6 N3 dN3 T2 901.23
Außerdem gibt es dcast.data.table
von data.table
library(data.table)
dcast.data.table(setDT(x), seq + detailed.name~treatment,
value.var='response')
# seq detailed.name T1 T2
#1: N1 dN1 123.23 343.23
#2: N2 dN2 231.12 281.13
#3: N3 dN3 231.23 901.23
Daten
x <- structure(list(unique_id = structure(c(1L, 1L, 1L, 2L, 2L, 2L
), .Label = c("a", "b"), class = "factor"), seq = structure(c(1L,
2L, 3L, 1L, 2L, 3L), .Label = c("N1", "N2", "N3"), class = "factor"),
response = c(123.23, 231.12, 231.23, 343.23, 281.13, 901.23
), detailed.name = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("dN1",
"dN2", "dN3"), class = "factor"), treatment = structure(c(1L,
1L, 1L, 2L, 2L, 2L), .Label = c("T1", "T2"), class = "factor")), .Names =
c("unique_id", "seq", "response", "detailed.name", "treatment"), class =
"data.frame", row.names = c(NA, -6L))
Sie können auch die reshape
Funktion im stats
Paket verwenden. Ich glaube nicht, Ihren Beispieldatensatz habe, aber es wird in etwa so aussehen:
reshape(x, idvar=c("seq","detailed.name"), timevar="treatment", direction="wide")
Wenn Sie die gleichen Ergebnisse mit reshape2
erhalten möchten, die eine schnellere und speichereffiziente Umschreiben des reshape
Paket ist, dann wird die folgende arbeiten.
Die wichtigste Änderung ist die Verwendung der dcast
Funktion, wenn Sie mit einem cast
als Ausgabe data.frame
wollen. Dies ersetzt die cast
Funktion von reshape
library(reshape2)
x = read.table(text = "unique_id seq response detailed.name treatment
a N1 123.23 dN1 T1
a N2 231.12 dN2 T1
a N3 231.23 dN3 T1
b N1 343.23 dN1 T2
b N2 281.13 dN2 T2
b N3 901.23 dN3 T2",
sep = "", header = TRUE)
x
y <- dcast(x, seq + detailed.name ~ treatment, value.var = "response")
y
# seq detailed.name T1 T2
# 1 N1 dN1 123.23 343.23
# 2 N2 dN2 231.12 281.13
# 3 N3 dN3 231.23 901.23
# EDIT to show how to return to the original data set:
melt(y, id.vars=c('seq', 'detailed.name'), variable.name='T', value.name='response')
# seq detailed.name T response
# 1 N1 dN1 T1 123.23
# 2 N2 dN2 T1 231.12
# 3 N3 dN3 T1 231.23
# 4 N1 dN1 T2 343.23
# 5 N2 dN2 T2 281.13
# 6 N3 dN3 T2 901.23