Несколько операций очистки в одном конвейере

Это скорее упражнение по очистке кода, которым я сейчас занимаюсь. Вот как выглядят мои исходные данные:

Year    County    Town  ...  Funding Received ... (90+ Variables total)
2016      a        x               Yes
2015      a        y               No
2014      a        x               Yes
2016      b        z               Yes

Я не мог понять, как я могу получить количество отправленных и одобренных приложений, поэтому я преобразовал его в переменные индикатора для подсчета с помощью следующего кода:

counties <- original_data %>%
  select(county, funded, year) %>%
  mutate(
    a=ifelse(county == "a", 1,0),
    b=ifelse(county == "b", 1,0),
    c=ifelse(county == "c", 1,0),
    ... etc ...
  )

И вывод выглядит так

County    Funding Received    Year    binary.a    binary.b
  a             Yes           2016       1           0
  a             No            2015       1           0
  b             No            2016       0           1

Затем эти данные были преобразованы в два фрейма данных (отправленные и профинансированные), чтобы получить количество поданных и профинансированных заявок каждого округа в год с использованием следующего кода:

countysum <- counties %>%
  select(-funded) %>%
  group_by(county, year) %>%
  summarise_all(sum, na.rm = T)

И вывод выглядит так:

County    Year    sum.a    sum.b
  a       2016      32       0
  a       2015      24       0
  b       2016       0      16

Но затем, чтобы получить данные в более аккуратном формате, я использовал еще несколько команд:

countysum$submitted <- rowSums(countysum[,3:15, na.rm = T) #3:15 are county indicator vars
countysum <- countysum[,-c(3:19)]

Теперь мой вопрос: есть ли способ свести все эти действия в единый конвейер? Прямо сейчас у меня есть работающий код, но я бы предпочел иметь работающий код, за которым немного легче следовать. Извиняюсь за отсутствие данных, не могу поделиться.


person MokeEire    schedule 27.07.2017    source источник
comment
Взгляните на tidyr::spread - я думаю, это то, что вы пытаетесь сделать в первом разделе.   -  person Andrew Gustar    schedule 28.07.2017
comment
Пожалуйста, покажите небольшой воспроизводимый пример. В вашем коде есть funded, но в примере он не показан   -  person akrun    schedule 28.07.2017
comment
@akrun моя ошибка, funded соответствует полученному финансированию в исходном сообщении.   -  person MokeEire    schedule 01.08.2017


Ответы (1)


Я не уверен, что вполне понимаю, как выглядит ваш окончательный желаемый результат, но я думаю, вы можете воспользоваться тем фактом, что логические значения приводятся к целым числам и пропустить создание фиктивных столбцов.

library(dplyr)

byyear  <- original_data %>% 
   group_by(county, year) %>% 
   summarize(
       wasfunded = any(funded == "Yes", na.rm = T)
     , submittedapplication = any(submittedapp == "Yes", na.rm = T) # I'm assuming did/didn't submit is one of the other variables
   ) 

# if you don't need the byyear data for something else (I always seem to), 
# you can pipe that straight into this next line
yrs_funded_by_county  <- byyear %>% 
  summarize(
      n_yrs_funded = sum(wasfunded)
    , n_yrs_submitted = sum(submittedapplication)
    , pct_awarded = n_yrs_funded/n_yrs_submitted  # maybe you don't need a award rate, but I threw it it b/c it's the kind of stuff my grant person cares about
  )
person crazybilly    schedule 28.07.2017