在R中的一组数据帧上循环
我是个新手,很快就有了疑问(我已经经历了很多关于堆栈溢出的问题,但都没有用) 我创建了一个函数(从代码中可以看出),其中x和y是日期,在R中的一组数据帧上循环,r,loops,dataframe,R,Loops,Dataframe,我是个新手,很快就有了疑问(我已经经历了很多关于堆栈溢出的问题,但都没有用) 我创建了一个函数(从代码中可以看出),其中x和y是日期,$z{1}到z{9}$是数据帧。该函数遍历9个文件,根据给定的日期对数据进行子集,并返回一个合并的数据集 DATE1_May <- as.Date("2017-11-16") DATE2_May <- as.Date("2018-02-15") myfunc1 <- function(x,y,z1,z2,z3,z4,z5,z6,z7,z8,z9
$z{1}到z{9}$
是数据帧。该函数遍历9个文件,根据给定的日期对数据进行子集,并返回一个合并的数据集
DATE1_May <- as.Date("2017-11-16")
DATE2_May <- as.Date("2018-02-15")
myfunc1 <- function(x,y,z1,z2,z3,z4,z5,z6,z7,z8,z9){
a1 <- z1[z1$Date >= x & z1$Date <= y,]
b1 <- a1[c(1,2)]
b1 <- data.frame(b1)
a2 <- z2[z2$Date >= x & z2$Date <= y,]
b2 <- a2[c(1,2)]
b2 <- data.frame(b2)
a3 <- z3[z3$Date >= x & z3$Date <= y,]
b3 <- a3[c(1,2)]
b3 <- data.frame(b3)
a4 <- z4[z4$Date >= x & z4$Date <= y,]
b4 <- a4[c(1,2)]
b4 <- data.frame(b4)
a5 <- z5[z5$Date >= x & z5$Date <= y,]
b5 <- a5[c(1,2)]
b5 <- data.frame(b5)
a6 <- z6[z6$Date >= x & z6$Date <= y,]
b6 <- a6[c(1,2)]
b6 <- data.frame(b6)
a7 <- z7[z7$Date >= x & z7$Date <= y,]
b7 <- a7[c(1,2)]
b7 <- data.frame(b7)
a8 <- z8[z8$Date >= x & z8$Date <= y,]
b8 <- a8[c(1,2)]
b8 <- data.frame(b8)
a9 <- z9[z9$Date >= x & z9$Date <= y,]
b9 <- a9[c(1,2)]
b9 <- data.frame(b9)
fin1 <- Reduce(function(x, y) merge(x, y, all=T, by=c("Date")), list(b1,b2,b3,b4,b5,b6,b7,b8,b9))
}
Testx1 <- myfunc1(DATE1_May,DATE2_May, May18,July18, September18, December18,March19, May19, July19, September19, December19)
我试图为循环创建一个,并使用assign
命令。然而,我不知道如何做到这一点。有没有一种方法可以让这一切自动化?(目前,我正在创建单独的功能,但这需要花费很多时间,因为我必须为100多份合同创建这些功能。)
有没有一种方法可以缩短函数(尽管它工作得非常好)
没有数据帧外观的示例是很困难的,但我建议使用tidyverse中的dpylr
和purrr
包
在这里,您将迭代列表中的每个数据帧,过滤每个数据帧的开始日期和结束日期之间的日期。最后,您可以使用reduce(与前面一样)将每个数据帧连接在一起。Reduce将一个函数依次应用于列表中的每个元素,在本例中是一个full\u join
,该函数将保留所连接数据帧的所有行
这可以使用一组中间变量编写,也可以使用%%>%%
运算符编写非常干净的代码
如果需要经常执行这些操作,我建议将这些步骤包装到函数中
library(tidyverse)
start_date <- as.Date("2017-11-16")
end_date <- as.Date("2018-02-15")
my_dfs <- list(z1, z2, z3, z4, z5, z6, z7, z8, z9)
my_dfs_filtered <- map(my_dfs, ~filter(.x, Date >= start_date & Date <= end_date))
my_dfs_joined <- reduce(my_dfs_filtered, full_join, by = "Date")
库(tidyverse)
start_date如果没有数据帧外观的示例,这很困难,但我建议使用tidyverse的dpylr
和purrr
包
在这里,您将迭代列表中的每个数据帧,过滤每个数据帧的开始日期和结束日期之间的日期。最后,您可以使用reduce(与前面一样)将每个数据帧连接在一起。Reduce将一个函数依次应用于列表中的每个元素,在本例中是一个full\u join
,该函数将保留所连接数据帧的所有行
这可以使用一组中间变量编写,也可以使用%%>%%
运算符编写非常干净的代码
如果需要经常执行这些操作,我建议将这些步骤包装到函数中
library(tidyverse)
start_date <- as.Date("2017-11-16")
end_date <- as.Date("2018-02-15")
my_dfs <- list(z1, z2, z3, z4, z5, z6, z7, z8, z9)
my_dfs_filtered <- map(my_dfs, ~filter(.x, Date >= start_date & Date <= end_date))
my_dfs_joined <- reduce(my_dfs_filtered, full_join, by = "Date")
库(tidyverse)
开始日期考虑推广重复代码的过程,使用..
为任何长度的动态参数构建一个具有lappy
的数据帧列表。然后使用Reduce
运行链合并,所有操作都使用基本R:
df_build <- function(x, y, ...) {
df_list <- lapply(..., function(df)
# ROW AND COLUMN INDEXING
df[df$Date >= x & df$Date <= y, c(1,2)]
)
# CHAIN MERGE FULL JOIN
merged_df <- Reduce(function(x, y) merge(x, y, all=TRUE, by=c("Date")),
df_list)
}
# MAY 2018 FUTURES
DATE1_May <- as.Date("2017-11-16")
DATE2_May <- as.Date("2018-02-15")
may_2018_df <- df_build(DATE1_May, DATE2_May,
May18, July18, September18,
December18, March19, May19,
July19, September19, December19)
# MAY 2017 FUTURES
DATE1_May <- as.Date("2016-11-16")
DATE2_May <- as.Date("2017-02-15")
may_2017_df <- df_build(DATE1_May, DATE2_May,
May17, July17, September17,
December17, March18, May18,
July18, September18, December18)
考虑推广重复代码的过程,使用..
为任何长度的动态参数构建一个具有lappy
的数据帧列表。然后使用Reduce
运行链合并,所有操作都使用基本R:
df_build <- function(x, y, ...) {
df_list <- lapply(..., function(df)
# ROW AND COLUMN INDEXING
df[df$Date >= x & df$Date <= y, c(1,2)]
)
# CHAIN MERGE FULL JOIN
merged_df <- Reduce(function(x, y) merge(x, y, all=TRUE, by=c("Date")),
df_list)
}
# MAY 2018 FUTURES
DATE1_May <- as.Date("2017-11-16")
DATE2_May <- as.Date("2018-02-15")
may_2018_df <- df_build(DATE1_May, DATE2_May,
May18, July18, September18,
December18, March19, May19,
July19, September19, December19)
# MAY 2017 FUTURES
DATE1_May <- as.Date("2016-11-16")
DATE2_May <- as.Date("2017-02-15")
may_2017_df <- df_build(DATE1_May, DATE2_May,
May17, July17, September17,
December17, March18, May18,
July18, September18, December18)
请添加一个。这样你可以帮助别人来帮助你!好的,让我试试,请添加一个。这样你可以帮助别人来帮助你!好的,让我试试,我在试这个代码;但是,我在match中得到一个错误。fun(fun):“get(paste0(“July”,yr))”不是函数、字符或符号
可能对象JulyXX
在您的全局环境中不存在。如果运行多年,请进行相应检查。此方法假定在运行之前存在此类数据帧对象。顺便说一句,不建议在全局环境中携带数百个单独的对象。相反,正如这个解决方案所示,使用命名列表(许多底层的、类似的结构化元素);但是,我在match中得到一个错误。fun(fun):“get(paste0(“July”,yr))”不是函数、字符或符号
可能对象JulyXX
在您的全局环境中不存在。如果运行多年,请进行相应检查。此方法假定在运行之前存在此类数据帧对象。顺便说一句,不建议在全局环境中携带数百个单独的对象。相反,如本解决方案所示,使用命名列表(许多底层的、类似的结构化元素)。
may_futures_list <- lapply(c(2010:2018), function(yr) {
DATE1_May <- as.Date(paste0(yr-1, "-11-16"))
DATE2_May <- as.Date(paste0(yr, "-02-15"))
may_df <- df_build(DATE1_May, DATE2_May,
get(paste0("May", yr)),
get(paste0("July", yr)),
get(paste0("September", yr)),
get(paste0("December", yr)),
get(paste0("March", yr+1)),
get(paste0("May", yr+1)),
get(paste0("July", yr+1)),
get(paste0("September", yr+1)),
get(paste0("December", yr+1))
)
})
# RENAME LIST ELEMENTS
may_futures_list <- setNames(may_futures_list,
as.character(c(2010:2018))
)
# RETRIEVE INDIVIDUALS DATA FRAMES
may_futures_list$`2018`
may_futures_list$`2017`
may_futures_list$`2016`
...