2016-06-03 3 views
1

ich auf ein Problem gekommen, wo ich brauche so einzigartig durch $IMS_ID & $IMS_PLAN_ID gruppierte jeden Wert gewichteter Durchschnitt von $Access_score wenn sum $lives!=0 und einfach av von $Access_score wenn sum $lives=0 und ‚Trx‘ zu erhaltenbestimmte Spalte Gruppierung von Spalten Aggregieren in R auf Basis der Bedingung

sc2=aggregate(nonsc1, by=list(nonsc1$PRSC_CID,nonsc1$IMSPayerPlanId), 
       FUN=function(x) if x$Lives=0 {colMeans(x$Breo_Access_score)} else {0}) 
dt <- data.frame(IMS_ID=c(222,222,222,222,333,333,333,333),IMS_PLAN_ID=c(234,234,235,235,234,234,235,235),PLAN_ID=c(1234,678,1234,678,1234,678,1234,678),IMS_STATE=c('CA','CA','CA','CA','TX','TX','TX','TX'),PLAN_STATE=c('CA','CA','CA','CA','TX','TX','TX','TX'),ACCESS_SCORE=c(2,4,2,4,2,4,2,4),Lives=c(0,0,1000,200,0,0,1000,200),Trx=c(10,10,20,20,30,30,40,40)); 

sollte Mein ausgegeben:

IMS_ID IMS_PLAN_ID TRX  ACCESS_SCORE 
222  234   10   3 
222  235   20  2.3333 
333  234   30   3 
333  235   40  2.3333 
+4

Bitte schreiben Sie keine Bilder von Daten - kopieren und die Daten aus Excel einfügen oder verwenden Sie 'dput (robjectname)' zu erhalten eine kopier- und paketierbare Darstellung der Daten. – thelatemail

Antwort

1

Basierend auf dem neuen Probeneingang und erwartete Ausgabe, wir können dies tun:

library(data.table); 
setDT(dt)[,{ s <- sum(Lives); cbind(.SD[1L,.(Trx)],ACCESS_SCORE=if (s==0) mean(ACCESS_SCORE) else sum(ACCESS_SCORE*Lives)/s); },.(IMS_ID,IMS_PLAN_ID)]; 
## IMS_ID IMS_PLAN_ID Trx ACCESS_SCORE 
## 1: 222   234 10  3.000000 
## 2: 222   235 20  2.333333 
## 3: 333   234 30  3.000000 
## 4: 333   235 40  2.333333 

Hier ist eine Lösung Basis R mit by():

df <- as.data.frame(dt); 
keys <- c('IMS_ID','IMS_PLAN_ID'); 
do.call(rbind,by(df,df[keys],function(g) { s <- sum(g$Lives); cbind(g[1L,c(keys,'Trx')],ACCESS_SCORE=if (s==0) mean(g$ACCESS_SCORE) else sum(g$ACCESS_SCORE*g$Lives)/s); })); 
## IMS_ID IMS_PLAN_ID Trx ACCESS_SCORE 
## 1 222   234 10  3.000000 
## 5 333   234 30  3.000000 
## 3 222   235 20  2.333333 
## 7 333   235 40  2.333333 
+1

Appios Ich korrigierte meine Frage andere Zeilen für andere IMsids der Datensatz hat verschiedene IMS_IDs innerhalb dieser verschiedenen IMS_PLAN_IDs Ich möchte für jeden IMS_IDS und seine einzigartige IMS_PLAN_IDs die Punktzahl. Thanks a ton – user3033197

+0

Fehler: unerwartete '=' in "nonsc1 [, {s <- sum (nichtc1 $ Leben); cbind (. SD [1L,. (Nicht $ 1 SumRTLRX_TRX_CNT)], nonsc1 $ Access_score =" Ich bekomme das Fehler – user3033197

+0

Das Problem ist die Qualifizierung: Entferne 'nonsc1 $' aus 'Lives',' Sum_RTLRX_TRX_CNT' und 'Access_score'. Die Qualifizierung ist nicht notwendig, und eigentlich * muss * nicht da sein, weil im' j' Argument Bei einer data.table Indizierungsoperation sind die Tabellenspalten (oder die aktuelle Teilmenge davon für eine Aggregation, wie wir sie hier haben) automatisch sichtbar und müssen daher nicht mit dem Namen der enthaltenden Variable qualifiziert werden. – bgoldst

Verwandte Themen