2017-01-20 4 views
1

Ich bin auf der Suche nach einer schnelleren Möglichkeit, nach Gruppentyp, für viele verschiedene Gruppen in einem df ohne Teilmenge zusammenzufassen. Unten ist ein Beispieldatenrahmen und der aktuelle Code, den ich verwende, um es zu erreichen. Es scheint mir sehr ausführlich zu sein, und ich vermute, dass es einen schnelleren Weg gibt, dies zu lösen. In diesem Beispiel fasst mein Code den Gesundheitsumsatz nach Name gruppiert zusammen und führt ihn dann wieder in den Master zusammen. Ich möchte sowohl Gesundheits- als auch Vision-Variablen zusammenfassen, gruppiert nach Namen. Der Schlüssel ist, dass ich nur Einkommen für Gesundheit und Vision will, wenn es eine 1 in der Variable gibt. Danke für Ihre Hilfe.Summe mehrerer Variablen nach Gruppentyp in einem df ohne Unterteilung

#df 
name = c("jerry","jerry","jerry","dave","dave","dave","mary","mary","mary") 
health = c(1,0,1,1,0,1,0,1,1) 
vision = c(0,1,0,0,1,0,1,0,0) 
rev =c(100,200,500,1000,800,300,400,600,300) 
df = data.frame(name,health,vision,rev) 


#Subset health 
health = subset(df, health == 1) 


#Sum by group type 
library(dplyr) 
health <- health %>% group_by(name) %>% 
    mutate(
    health_rev=sum(rev, na.rm = TRUE)) 


#Select variables 
health <- health[c("name","health_rev")] 


#Remove duplicates 
health <- health[!duplicated(health$name), ] 


#Merge back to master 
master <- merge(x = df, y = health, by = "name", all.x = TRUE) 
+0

Manchmal zu lange Umformung macht Ihre Daten einfacher zu handhaben: 'Bibliothek (tidyverse); df%>% sammeln (var, val, health, vision)%>% filtern (as.logical (val))%>% group_by (name, var)%>% zusammenfassen (rev = sum (rev))%>% spread (var, rev) ' – alistaire

Antwort

3

So etwas wie das?

df %>% 
    group_by(name) %>% 
    mutate(health_rev = sum(rev[as.logical(health)]), 
      vision_rev = sum(rev[as.logical(vision)])) %>% 
    ungroup() 

Ergebnis:

# A tibble: 9 × 6 
    name health_rev vision_rev health vision rev 
    <chr>  <dbl>  <dbl> <dbl> <dbl> <dbl> 
1 dave  1300  800  1  0 1000 
2 dave  1300  800  0  1 800 
3 dave  1300  800  1  0 300 
4 jerry  600  200  1  0 100 
5 jerry  600  200  0  1 200 
6 jerry  600  200  1  0 500 
7 mary  900  400  0  1 400 
8 mary  900  400  1  0 600 
9 mary  900  400  1  0 300 
+0

Weit eleganter als meine Methode. Danke, @Chrisss. – richiepop2

Verwandte Themen