Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在R中的一组数据帧上循环_R_Loops_Dataframe - Fatal编程技术网

在R中的一组数据帧上循环

在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

我是个新手,很快就有了疑问(我已经经历了很多关于堆栈溢出的问题,但都没有用)

我创建了一个函数(从代码中可以看出),其中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){
  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`
    ...