sanaz sanaz - 3 months ago 11
R Question

how to convert dplyr::summaries to dplyr::do

I have the following data frame:

label target sale
low 5000 4000
low 11000 9000
low 5500 4500
low 12000 9500
middle 20000 18000
middle 22000 190000
high 100000 90000
high 120000 95000


I need to first group my data frame by label and then calculate: mean(target - sale) only for rows where target is more than 10000, I tried following code:

library(dplyr)
avg_increase <- df %>%
group_by(labels) %>%
summarise(avg_sale_increase = ifelse(target >= 10000,mean(target - sale), 0))


and I get the following error:


Error: expecting a single value


As
summarise
only returns single values, should I change my code using
deployer::do
(or any other suggestion) to accomplish the task.

Answer

The problem is with ifelse, which returns a vector if length equal to the input logical, so the mean is going to be calculated as many times as required.

This should work

avg_increase <- df %>% 
                group_by(labels) %>% 
                filter(target >= 10000) %>% 
                summarise(target = mean(target-sale))