Frage

    

Diese Frage bereits eine Antwort hier:

         

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.

War es hilfreich?

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

durchgeführt
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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top