r - 如何将两个输入传递给 R 中的 %>% 运算符
问题描述
最初我有这段代码,我试图使用 %>% 运算符来简化和提高可读性。
#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)
我不想存储中间变量,这就是为什么我认为管道运算符是一个不错的选择,但我无法重现结果。
这是我尝试过的
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
数据框有我试图绑定和添加新日期的日期。
如何在不创建新变量的情况下获取每个步骤的输出并将其作为输入放入下一行?
请解释这些步骤,以便我可以理解简化上述代码的过程。
解决方案
有专门为管道操作员设计的功能tidyverse
。这些函数非常适合使用管道运算符,而不是使用基本 R 运算符并尝试将它们放入管道中。tidyverse
您仍然可以在管道中使用基本 R 函数,但使用工具使用它们更方便。
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
推荐阅读
- java - 尝试使用 @RunWith 运行 JUnit 测试时出现初始化错误
- python - 有没有更好的方法来构造这个代码继承?
- python-3.x - Python将列表转换为数组
- r - R 语言错误:“date_trans 仅适用于 Date 类的对象”(ggplot2)
- c - 如何避免链表的分段错误
- php - 为什么只有默认控制器在本地 WAMP 上的 CodeIgniter 中工作?
- azure - Azure SQL 无服务器数据库 cpu 不断计费
- java - 使用命令行从 pom.xml 获取依赖项的版本号,并使用该版本号标记 docker 映像
- apache-kafka - Apache Flink 中 KafkaProducer 的语义一次导致生产率低
- firebase - auth onCreate 触发器需要多长时间才能运行