2016-07-14 16 views
1

Lange Zeit Leser und das erste Mal Poster, mal sehen, wie das geht ...Wie spalte ich Werte in einer Spalte in mehrere Spalten basierend auf einem Faktor in R?

Ich arbeite in R, um eine Zusammenfassung der durchschnittlichen Auslagenkosten für verschiedene Medikamente auf der Grundlage verschiedener Gesundheitsdienstleister zu erstellen. In den Daten habe ich viel mehr Unternehmen (~ 5000) als ich Produkte (4). Ich weiß, dass durch Aggregation der aus eigener Tasche Kosten von Produkt und Arzt beginnen, wie unten dargestellt:

avgdf <- aggregate(price ~ company + product, data= df, mean) 
colnames(avgdf) <- c("company", "prod", "avg_price") 

Der resultierende Datenrahmen sieht wie folgt aus: (aus Gründen der Vertraulichkeit Hinweis kann ich nicht die tatsächlichen Daten veröffentlichen, haben aber ein allgemeines Beispiel)

company prod avg_price 
A  1  88 
A  2  63 
A  3  46 
B  1  55 
C  2  8 
D  1  67 
D  2  42 
D  3  40 
D  4  61 
E  1  13 
E  2  17 
F  1  85 
F  4  17 

zeigen möchte ich den Datenrahmen zu transformieren, so dass die prod Säule in 4 Spalten aufgeteilt ist, einen für jeden der jeweiligen Produkte, und die Werte dieser 4 Spalten ausgefüllt sind entsprechend zu seinem Unternehmen-Produkt-Paar. Mit anderen Worten, ich möchte die Tabelle wie folgt aussehen:

company prod1.avg_price prod2.avg_price prod3.avg_price prod4.avg_price 
A  88    63    46    NA 
B  55    NA    NA    NA 
C  NA    2    NA    NA 
D  67    42    40    61 
E  13    17    NA    NA 
F  85    NA    NA    17 

Ich sollte nicht so viele NA in meinem Dataset haben, wie es in meinem Beispiel sind, aber ich möchte eine Lösung, die es verarbeiten kann. Meine Vermutung ist, reshape2melt und dcast Funktionen zu verwenden, aber ich bin mir nicht sicher, wie man es umsetzt. Vielen Dank im Voraus für die Hilfe!

+0

Mit dplyr und tidyr, 'avgdf%>% mutieren (prod = paste0 ('prod', prod '.avg_price'))%>% Spread (prod, avg_price)' – alistaire

Antwort

1

Wir können dcast von data.table verwenden, um es in 'Wide' Format umzuformen.

library(data.table) 
dcast(setDT(avgdf), company~paste0("prod", prod, ".avg_price"), value.var = "avg_price") 
# company prod1.avg_price prod2.avg_price prod3.avg_price prod4.avg_price 
#1:  A    88    63    46    NA 
#2:  B    55    NA    NA    NA 
#3:  C    NA    8    NA    NA 
#4:  D    67    42    40    61 
#5:  E    13    17    NA    NA 
#6:  F    85    NA    NA    17 
Verwandte Themen