Как передать два входа оператору%>% в R - PullRequest
0 голосов
/ 24 марта 2019

Первоначально у меня есть этот код, который я пытаюсь упростить и улучшить удобочитаемость, используя оператор%>%.

#Get Sunday's from 2018-01-01 till today
d = seq(as.Date("2018-01-01"),Sys.Date()+365,by='day')
HolidayList = data.frame(Holidays=d[weekdays(d)=='Sunday'])

#Get Alternate saturdays 2nd and 4th
d = seq(as.Date("2018-01-01"),Sys.Date()+365,by='day')
saturdayList = d[weekdays(d)=='Saturday']
altSaturdayList = lapply(split(saturdayList, format(saturdayList, "%Y-%m")), function(x)
  na.omit(x[c(2,4)]))
altSaturdayList = as.data.frame(altSaturdayList)
altSaturdayList = gather(altSaturdayList)
altSaturdayList = subset(altSaturdayList,select = c(value))
HolidayList = rbind(HolidayList, setNames(altSaturdayList, "Holidays"))
HolidayList = rbind(HolidayList, setNames(as.data.frame(as.Date("2018-11-06")), "Holidays"))
HolidayList = unique(HolidayList)
HolidayList = arrange(HolidayList,Holidays)
rm(d)
rm(saturdayList)
rm(altSaturdayList)

Я не хочу хранить промежуточные переменные, поэтому я подумал, что оператор pipe будет хорошим выбором, но я не могу воспроизвести результат.

Вот что я попробовал

HolidayList = saturdayList %>% 
    data.frame(lapply(split(saturdayList, format(saturdayList, "%Y-%m")), function(x)
    na.omit(x[c(2,4)]))) %>% 
    subset(gather(altSaturdayList),select = c(value)) %>% 
    rbind(HolidayList, setNames(altSaturdayList, "Holidays")) %>% 
    rbind(HolidayList, setNames(as.data.frame(as.Date("2018-11-06")), "Holidays")) %>% 
    arrange(unique(HolidayList),Holidays)

Holidays датафрейм содержит даты, к которым я пытаюсь привязать и добавить новые даты.

Как мне взять вывод каждого шага и поместить в качестве ввода в следующую строку, не создавая новые переменные?

Пожалуйста, объясните шаги, чтобы я мог понять процесс упрощения приведенного выше кода.

1 Ответ

2 голосов
/ 24 марта 2019

В tidyverse есть функции, специально разработанные для операторов труб. Эти функции хорошо подходят для использования операторов канала вместо использования базовых R-операторов и их размещения в конвейере. Вы все еще можете использовать базовые функции R в конвейере, но их удобнее использовать с помощью tidyverse инструментов.

library(tidyverse)

temp <- map_dfr(split(saturdayList,format(saturdayList, "%Y-%m")), ~ .[c(2, 4)]) %>%
    gather(key, Holidays) %>%
    select(Holidays) %>%
    bind_rows(HolidayList) %>%
    add_row(Holidays = as.Date("2018-11-06")) %>%
    unique() %>%
    na.omit() %>%
    arrange(Holidays) 

temp

#   Holidays  
#   <date>    
# 1 2018-01-07
# 2 2018-01-13
# 3 2018-01-14
# 4 2018-01-21
# 5 2018-01-27
# 6 2018-01-28
# 7 2018-02-04
# 8 2018-02-10
# 9 2018-02-11
#10 2018-02-18
# … with 160 more rows

Чтобы подтвердить, что выходные данные из них одинаковы, мы можем преобразовать temp во фрейм данных, а затем сравнить с HolidayList на последнем шаге.

identical(data.frame(temp), HolidayList)
#[1] TRUE
...