2016-05-05 11 views
3

Ich habe gesucht, aber immer noch nicht die Antwort gefunden. Ich möchte bestimmte Ergebnisse basierend auf meinen Kriterien sehen und berechnen. if und match Funktionen würde nicht bekommen, wonach ich suche. Das Original-Datensatz sieht wie folgt aus:Zurückgeben und Werte basierend auf ausgewählten Kriterien berechnen

Type Name Value 
A  DK 3 
A  MO 2 
A  OM 5 
A  LSO 3 
B  GOP 6 
B  ADG 5 
C  BFC 7 
D  TMD 6 

Was ich zu bekommen ist, wenn Typ = A, dann die Namen auflisten und das Gewicht auf Wert basierend berechnet werden, die wie folgt aussehen sollte:

DK 0.081 
MO 0.054 
OM 0.135 
LSO 0.081 

Jeder Vorschlag wird geschätzt. Ich danke dir sehr!

+4

'prop.table' und Teilmenge? 'prop.table (Wert) [Type == 'A']' – rawr

+1

Bitte fügen Sie immer R-Code hinzu, der den data.frame erstellt, um die Beantwortung Ihrer Frage zu erleichtern :-) –

+0

"Gewicht basierend auf Wert" bedeutet das Gewicht des Wertes innerhalb der Gruppe oder aller Gruppen (was die kleinen Werte anzeigen)? –

Antwort

3
require(dplyr) 


d<-data.frame(Type=c("A","A","A","A","B","B","C","D"), 
       Name = c("DK","MO","OM","LSO","GOP","ADG","BFC","TMD "), 
       Value=c(3,2,5,3,6,5,7,6) 
      ) 

dd<- d %>% 
     mutate(den=sum(Value)) %>% 
     filter(Type=="A") %>% 
     group_by(Name) %>% 
     summarise(Y=Value/min(den)) 
dd 
+0

Danke Gaurav, aber ich habe diese "Fehler: konnte Funktion nicht finden "%>%" 'Wie behebt man das? –

+0

Haben Sie dplyr Paket installiert? Versuchen Sie 'install.packages (" dplyr ")' 'auszuführen. Wenn es installiert ist, sollten Sie den Fehler nicht erhalten. –

+0

Haben Sie vergessen, das Paket zu laden. Danke nochmal! –

2

Wenn Leistung zählt, und Sie haben eine Menge Daten ein data.table aus dem Paket data.table verwenden:

dt <- data.table(type=c("A", "A", "A", "A", "B", "B", "C", "D") 
        , name=c("DK", "MO", "OM", "LSO", "GOP", "ADG", "BFC", "TMD") 
        , value=c(3, 2, 5, 3, 6, 5, 7, 6)) 

value.total <- sum(dt$value) 

dt[type=="A", .(name, weight=value/value.total)] 

Dies führt zu:

name  weight 
1: DK 0.08108108 
2: MO 0.05405405 
3: OM 0.13513514 
4: LSO 0.08108108 

Wenn Sie das Gewicht ("Anteil") für jede Zeile (nicht nur "A") berechnen wollen:

dt[, .(name, weight=value/value.total)] 

was dazu führt:

name  weight 
1: DK 0.08108108 
2: MO 0.05405405 
3: OM 0.13513514 
4: LSO 0.08108108 
5: GOP 0.16216216 
6: ADG 0.13513514 
7: BFC 0.18918919 
8: TMD 0.16216216 
+0

Perfekt! Danke vielmals! –

1
Type <- c('A','A','A','A','B','B','C','D') 
Name <- c('DK', 'MO', 'OM', 'LSO', 'GOP', 'ADG','BFC','TMD') 
Value <- c(3,2,5,3,6,5,7,6) 
Dat <- data.frame(Type, Name,Value) 
Dat 
    Type Name Value 
1 A DK  3 
2 A MO  2 
3 A OM  5 
4 A LSO  3 
5 B GOP  6 
6 B ADG  5 
7 C BFC  7 
8 D TMD  6 

new.dat <- data.frame(Name, Weight=(Value/sum(Value))) 
new.dat 
    Name  Weight 
1 DK  0.08108108 
2 MO  0.05405405 
3 OM  0.13513514 
4 LSO  0.08108108 
5 GOP  0.16216216 
6 ADG  0.13513514 
7 BFC  0.18918919 
8 TMD  0.16216216 
Verwandte Themen