2016-04-12 10 views
0

Ich habe eine Reihe von Daten, die aus Matlab kommt, und ich möchte es in R verwenden. Ich habe eine Reihe von Themen, und eine Reihe von Bedingungen innerhalb jedes Subjekts. In jeder Bedingung erzeugte jedes Subjekt einige Daten. Ich schrieb dies in einen „hoch“ Tisch, etwa so:Mit tidyr oder ähnlich, um einen hohen Datensatz breit zu machen, während mehrere Werte in einen Vektor zusammenfallen

subject condition data 
#1 id1  cond1  0.12 
#2 id1  cond1  0.43 
#3 id1  cond2  1.26 
#4 id2  cond1  1.96 
#5 id2  cond2  0.24 
#6 id2  cond2  0.62 
... 

Wie Sie sehen können, ist ein Problem, dass es für jedes Thema nicht die gleiche Anzahl von Werten in jedem Zustand ist, und es ist nicht die gleiche Anzahl der Werte in jeder Bedingung innerhalb von Fächern, entweder. Ich habe Interesse an den Verteilungen dieser Variablen zwischen den Themen, so dass ich hoffte, auf rohe Werte in einer Liste in einem „breit“ Datenrahmen beibehalten, wie folgt aus:

subject condition data 
#1 id1  cond1  c(0.12, 0.43) 
#2 id1  cond2  c(1.26) 
#3 id2  cond1  c(1.96) 
#4 id2  cond2  c(0.24, 0.62) 
... 

Was ist der beste Weg, dies zu tun ? Ich habe in der Vergangenheit tidyr :: spread() verwendet, was hier ohne eine eindeutige identifizierende Variable pro Zeile nicht funktioniert, aber selbst wenn ich hinzugefügt habe, sehe ich nicht, wie es funktionieren würde.

Ich habe auch versucht, mit dplyr :: group_by (Daten, Thema, Bedingung), aber ich bin mir nicht sicher, wie von dort aus zu gehen. Wäre es möglich, die gruppierte Tabelle zusammenzufassen, indem Sie c() als Zusammenfassungsfunktion verwenden? Das hat bei mir nicht funktioniert.

Wie immer, danke für jede Hilfe!

+0

Wenn Sie die gleiche Anzahl von Spalten haben, werden Ihre Daten nicht ihre Form verändern von groß zu breit - die Breite (Anzahl der Spalten) ist konstant! Sie aggregieren nur - indem Sie vorhandene Zeilen in einer einzelnen Zeile zusammenfassen. – Gregor

+0

Ich bin mir nicht sicher, wie die Repräsentation * nützlich sein könnte. Das gängige Idiom wäre "dplyr :: group_by" und dann "dplyr :: summarize()", um zu tun, was immer Sie tun möchten, um "die Verteilungen dieser Variablen zwischen Subjekten" zu betrachten. Bitte teilen Sie uns Ihr Endziel mit, und nicht nur einen Zwischenschritt, den Sie für notwendig halten (was aber möglicherweise ein einfaches Problem überkompensiert). – Gregor

+0

Wir wollen [XY-Probleme] vermeiden (http: //meta.stackexchange. com/a/66378/173584). – Gregor

Antwort

2

Sie könnten aggregate() verwenden, um die list Spalte data zu erstellen, die aus numerischen Vektoren besteht.

aggregate(data ~ subject + condition, FUN = list, data = df) 
# subject condition  data 
#1  id1  cond1 0.12, 0.43 
#2  id2  cond1  1.96 
#3  id1  cond2  1.26 
#4  id2  cond2 0.24, 0.62 
+0

Danke - das hat funktioniert! Wie Gregor unter der ursprünglichen Frage sagte, verwirrte ich meine Terminologie. Ich war nicht wirklich auf der Suche nach einer Möglichkeit, es breiter zu machen. Aber mit Ihrer Lösung wäre das auch ganz einfach: 'wideData <- df %>% Aggregat (Daten ~ Betreff + Bedingung, FUN = Liste,.)%>% Spread (Bedingung, Daten)' – janfreyberg

0
library(dplyr) 
library(tidyr) 

data = 
"subject condition data 
id1  cond1  0.12 
id1  cond1  0.43 
id1  cond2  1.26 
id2  cond1  1.96 
id2  cond2  0.24 
id2  cond2  0.62" %>% 
    read.table(text = ., header = TRUE) 

Für breite Form:

wide_form = 
    data %>% 
    group_by(subject, condition) %>% 
    mutate(order = 1:n() %>% paste0("value", .)) %>% 
    spread(order, data) 

Für verschachtelte Form:

nested_form = 
    data %>% 
    group_by(subject, condition) %>% 
    summarize(data = data %>% list)