2016-03-28 8 views
1

Hier ist, was die ursprüngliche Datenrahmen wie folgt aussieht:Finding Prozentsatz basiert auf zwei Säulen

  PLACEMENT  SIZE  COST 
1  placement1  LARGE 1838128.00 
58  placement1  MEDIUM 10962048.00 
117  placement1  SMALL 2622851.00 
175  placement1  UNKNOWN 443.00 
2  placement2  LARGE 598.00 
59  placement2  MEDIUM 24358.00 
118  placement2  SMALL 571802.00 
176  placement2  UNKNOWN 1706.00 
3  placement3  LARGE 8.00 
60  placement3  MEDIUM 22.00 
119  placement3  SMALL 502388.00 
177  placement3  UNKNOWN 762.00 

Wie erstellen Sie eine Spalte, die den Prozentsatz der Größe von PLATZIERUNG zeigt?

Ich mag es so am Ende aussehen:

  PLACEMENT  SIZE  COST   PERCENTAGE 
1  placement1  LARGE 1838128.00   11.9 
58  placement1  MEDIUM 10962048.00  71.1 
117  placement1  SMALL 2622851.00   17.0 
175  placement1  UNKNOWN 443.00    0.0 
2  placement2  LARGE 598.00    0.1 
59  placement2  MEDIUM 24358.00   4.07 
118  placement2  SMALL 571802.00   95.54 
176  placement2  UNKNOWN 1706.00   0.29 
3  placement3  LARGE 8.00    0.0 
60  placement3  MEDIUM 22.00    0.0 
119  placement3  SMALL 502388.00   99.84 
177  placement3  UNKNOWN 762.00    0.16 

Jede Hilfe wäre toll, danke! Ich kann es mit der Bibliothek repro.table nicht herausfinden, obwohl ich das Gefühl habe, dass es das ist, was ich benutzen soll.

+2

Som e mögliche Duplikate: http://StackOverflow.com/Q/16716269/ und http://StackOverflow.com/Q/22231357/ und http://StackOverflow.com/Q/25134347/ und http://StackOverflow.com/q/24247462/und http://stackoverflow.com/q/31394227/ – Frank

Antwort

2

Sie können es schnell mit dplyr:

library(dplyr) 
df <- df %>% group_by(PLACEMENT) %>% mutate(PERCENTAGE=COST/SUM(COST)) 

Es ist wie die Ergebnisse sieht Sie wollen auch abgerundet sind, die Sie mit der Funktion runden tun können(), wenn Sie möchten.

Bearbeiten Wenn Sie Ihre Prozentsätze zwischen 1 und 100 halten möchten, können Sie das natürlich tun, indem Sie 100 * COST/SUM (COST) schreiben, wenn Sie es lieber so haben.

+0

Das ist genau das, was ich brauche, danke! @ Gabriel FGM –

1

Angenommen, Ihr Datenrahmen Eingang ist DF dies wird es tun. Keine Pakete werden benötigt.

transform(DF, PC = 100 * ave(COST, PLACEMENT, FUN = prop.table)) 

geben:

 PLACEMENT SIZE  COST   PC 
1 placement1 LARGE 1838128 11.917733169 
58 placement1 MEDIUM 10962048 71.073811535 
117 placement1 SMALL 2622851 17.005583050 
175 placement1 UNKNOWN  443 0.002872246 
2 placement2 LARGE  598 0.099922468 
59 placement2 MEDIUM 24358 4.070086087 
118 placement2 SMALL 571802 95.544928350 
176 placement2 UNKNOWN  1706 0.285063095 
3 placement3 LARGE  8 0.001589888 
60 placement3 MEDIUM  22 0.004372193 
119 placement3 SMALL 502388 99.842601057 
177 placement3 UNKNOWN  762 0.151436862 

Hinweis: Die Eingabe in reproduzierbarer Form ist:

Lines <- "PLACEMENT  SIZE  COST 
1  placement1  LARGE 1838128.00 
58  placement1  MEDIUM 10962048.00 
117  placement1  SMALL 2622851.00 
175  placement1  UNKNOWN 443.00 
2  placement2  LARGE 598.00 
59  placement2  MEDIUM 24358.00 
118  placement2  SMALL 571802.00 
176  placement2  UNKNOWN 1706.00 
3  placement3  LARGE 8.00 
60  placement3  MEDIUM 22.00 
119  placement3  SMALL 502388.00 
177  placement3  UNKNOWN 762.00" 

DF <- read.table(text = Lines, header = TRUE) 
0

Hier ist eine Option mit data.table

library(data.table) 
setDT(df)[, PERCENTAGE := COST/SUM(COST) , by = PLACEMENT]