2016-07-19 4 views
2

Ich habe eine Daten wie folgt und ich möchte es in langes Format konvertieren.R: Konvertieren von Daten von Wide zu Long - mehrere Bedingungen - Fehler erhalten

id count a1  b1 c1 a2  b2 c2 a3 b3 c3 age 
1 1  apple 2 3 orange 3 2 beer 2 1 50 
1 2  orange 3 2 apple 2 2 beer 2 1 50 
2 1  pear 3 2 apple 2 2 orange 2 2 45 

[a1, b1, c1], [a2, b2, c2], [a3, b3, c3] ist der Satz von drei Attributen, der Person mit einer zugeordneten ID zugewandt ist, und diese Person kann Gesicht multiple Wahlsituationen mit Zählung, die die i-te Wahlsituation anzeigen. Ich möchte es zu einem langen Format zurück zu ändern, während die anderen Variablen behalten wie folgt aus:

id count a b c age 
1 1  apple 2 3 50 
1 1  orange 3 2 50 
1 1  beer 2 1 50 
1 2  orange 3 2 50 
1 2  apple 2 2 50 
1 2  beer 2 1 50 
2 1  pear 3 2 45 
2 1  apple 2 2 45 
2 1  orange 2 2 45 

ich mit den folgenden Befehlen versucht reshape, aber ich verwirrt in Bezug auf, wo mit timevar und Zeiten beschäftigen:

l <- reshape(df, 
      varying = df[,3:11], 
      v.names = c("a","b","c"), 
      timevar = "choice", 
      times = c("a","b","c"), 
      direction = "long") 

mit den oben genannten Befehlen kann ich nicht das Ergebnis, das ich will, würden herzlichst jede Hilfe zu schätzen wissen!

Antwort

2

Um die reshape Funktion zu nutzen, müssen Sie nur noch das unterschiedliche Argument einzustellen. Es kann eine Liste sein, und Sie wollen die Variablen setzen, die die gleiche Säule zusammen als Vektoren in einer Liste bilden werden:

reshape(df, 
     idvar=c("id", "count", "age"), 
     varying = list(c(3,6,9), c(4,7,10), c(5,8,11)), 
     timevar="time", 
     v.names=c("a", "b", "c"), 
     direction = "long") 

Das gibt

  id count age time  a b c 
1.1.50.1 1  1 50 1 apple 2 3 
1.2.50.1 1  2 50 1 orange 3 2 
2.1.45.1 2  1 45 1 pear 3 2 
1.1.50.2 1  1 50 2 orange 3 2 
1.2.50.2 1  2 50 2 apple 2 2 
2.1.45.2 2  1 45 2 apple 2 2 
1.1.50.3 1  1 50 3 beer 2 1 
1.2.50.3 1  2 50 3 beer 2 1 
2.1.45.3 2  1 45 3 orange 2 2 

ich auch in den idvars wie ich hinzugefügt denke, das ist in der Regel eine gute Übung für andere oder für das erneute Lesen Ihres alten Codes.

Daten

df <- read.table(header=T, text="id count a1  b1 c1 a2  b2 c2 a3 b3 c3 age 
1 1  apple 2 3 orange 3 2 beer 2 1 50 
1 2  orange 3 2 apple 2 2 beer 2 1 50 
2 1  pear 3 2 apple 2 2 orange 2 2 45") 
+0

verwenden können, wenn ich versuchte, heißt es Fehler in .subset (x, j): ungültige Index Typ 'Liste' – lll

+0

Ich habe gerade angefangen eine neue R-Sitzung und führte den Code mit den Daten, die ich gerade hinzugefügt habe, ohne einen Fehler aus. – lmo

+1

Sie müssen die variierenden Gruppen oder die Namen nicht manuell angeben, 'reshape()' kann es erraten 'umformen (dat, idvar = c ("id", "count", "alter"), direction = "long ", variierend = 3: 11, sep =" ")" Das 'sep =" "gibt nur an, dass jedes" a/b/c "und" 1/2/3 "durch nichts" "" getrennt ist, was erlaubt die "timevar" und die "v.names", die abgeleitet werden sollen. – thelatemail

4

Verwenden Sie die melt Funktion von data.table Paket:

library(data.table) 
setDT(df) 
melt(df, id.vars = c('id', 'count', 'age'), 
     measure = patterns('a\\d', 'b\\d', 'c\\d'), 
     # this needs to be regular expression to group `a1, a2, a3` etc together and 
     # the `\\d` is necessary because you have an age variable in the column. 
     value.name = c('a', 'b', 'c'))[, variable := NULL][order(id, count, -age)] 

# id count age  a b c 
# 1: 1  1 50 apple 2 3 
# 2: 1  1 50 orange 3 2 
# 3: 1  1 50 beer 2 1 
# 4: 1  2 50 orange 3 2 
# 5: 1  2 50 apple 2 2 
# 6: 1  2 50 beer 2 1 
# 7: 2  1 45 pear 3 2 
# 8: 2  1 45 apple 2 2 
# 9: 2  1 45 orange 2 2 
3

Wir dplyr/tidyr

library(dplyr) 
library(tidyr) 
gather(df1, Var, Val, a1:c3) %>% 
     extract(Var, into = c("Var1", "Var2"), "(.)(.)") %>% 
     spread(Var1, Val) %>% 
     select(-Var2) 
# id count age  a b c 
#1 1  1 50 apple 2 3 
#2 1  1 50 orange 3 2 
#3 1  1 50 beer 2 1 
#4 1  2 50 orange 3 2 
#5 1  2 50 apple 2 2 
#6 1  2 50 beer 2 1 
#7 2  1 45 pear 3 2 
#8 2  1 45 apple 2 2 
#9 2  1 45 orange 2 2 
Verwandte Themen