2016-07-14 3 views
0

Mein Datensatz enthält eine Spalte für product Typ und für purchase Menge. Ich möchte in der Lage sein, die durchschnittliche purchase Menge für jede product Art von der tatsächlichen purchase auf jeder Linie zu subtrahieren.R - Bedingte IF Minus Jede Zeilenabgleichsbedingung

data_s <- split(fake_data, fake_data$product) #split 
data_a <- lapply(data_s, function(m) cbind(m, m$purch - mean(m$purch))) #apply 
data_c <- bind_rows(data_a) #combine 

Dies funktioniert, aber es tritt rechts:

ich einen Datensatz haben, die ungefähr so ​​

library(dplyr) 
set.seed(42) 
product <- paste("prod - " , sample(c("A", "B", "C", "D"), size = 15, 
           replace = TRUE)) 
purch <- sample(5:10, size = 15, replace = TRUE) 

fake_data <- tibble(product, purch) 

ich dies wie folgt mit einem Split-apply-kombinieren Methode tun können, sieht in der Mitte einer ansonsten langen und gut organisierten Kette mit %>% und dplyr. Gibt es eine Möglichkeit, dies mit dplyr zu tun, so dass ich bekommen kann, was ich brauche, ohne die Kette zu brechen?

Vielen Dank.

Antwort

1
library(dplyr) 
fake_data %>% group_by(product) %>% 
       mutate(NewVal = purch - mean(purch)) %>% arrange(product) 
+0

Funktioniert wie ein Charme. Vielen Dank. –