【问题标题】:Applying same function on multiple objects in R在R中的多个对象上应用相同的功能
【发布时间】:2020-07-28 14:55:54
【问题描述】:

我开发了一个函数,可以对某些系列进行一些计量经济学测试。我想在多个对象上同时运行这个函数。我正在使用 lapply 函数,但它正在生成以下错误。 [.data.frame(tsmom, , 1:5) 中的错误:选择了未定义的列。如果我单独运行此功能,则该功能正常工作。检查我的代码

library(xts)
library(zoo)
library(lmtest)
library(sandwich)
list_tsfiles<-list.files(pattern = "^tsmom.*?.*\\.xlsx$")
list_csfiles<-list.files(pattern = "^csmom.*?.*\\.xlsx$")
list_dmfiles<-list.files(pattern = "^dualmom.*?.*\\.xlsx$")
list_tmfiles<-list.files(pattern = "^tpmom.*?.*\\.xlsx$")
newey<-function(list_files){
tsmom<-do.call(cbind,lapply(list_files,function(x) read_excel(x)[,2]))
tsmom<-xts(tsmom[,1:5],order.by = seq(as.Date("2005-02-01"),length=183,by="months")-1)
names(tsmom)<-c("tsmom121","tsmom123","tsmom126","tsmom129","tsmom1212")

## newey west
newey_west<-function(x){
  model<-lm(x~1)
  newey_west<-coeftest(model,vcov=NeweyWest(model,verbose=T))
  newey_west[c(1,3,4)]
}

## running newey west 
cs_nw_full<-do.call(cbind,lapply(tsmom,newey_west))
library(gtools)
p_values<-cs_nw_full[3,]
cs_nw_full[2,]<-paste0(cs_nw_full[2,],stars.pval(p_values))
write.xlsx(cs_nw_full, paste0(deparse(substitute(list_files)), ".xlsx"))
}
## Applying the function on all objects simtanously
list_all<-c(list_csfiles,list_tsfiles,list_dmfiles,list_tmfiles)
lapply(list_all,newey)
## Individually running this function
newey(list_csfiles)

【问题讨论】:

  • 但您的项目在列表中。试试list_all&lt;-list(list_csfiles, list_tsfiles, list_dmfiles, list_tmfiles)。如果这不起作用,请描述“不起作用”的含义。你有错误吗?和你期待的不一样?如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。我们目前无法测试,因为我们没有任何数据。

标签: r


【解决方案1】:

创建一个命名列表:

list_all<- dplyr::lst(list_csfiles,list_tsfiles,list_dmfiles,list_tmfiles)

在函数中分别传递数据和名称:

newey<-function(list_files, name) {
  #All the code as it is
  #...
  #...
  #...
  write.xlsx(cs_nw_full, paste0(name, ".xlsx"))
}

然后您可以使用Map

Map(newey, list_all, names(list_all))

或者purrr::imap

purrr::imap(list_all, newey)

【讨论】:

    【解决方案2】:

    制作所有列表对象的主列表。然后在上面应用mapply()。

    list_all<-list(list_csfiles,list_tsfiles,list_dmfiles,list_tmfiles)
    mapply(newey,list_all)
    
    

    【讨论】:

    • 虽然该功能正在运行。但它没有生成所需的 excel 文件名称
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 1970-01-01
    • 2021-04-04
    • 2020-07-11
    • 2021-12-11
    • 2014-05-29
    相关资源
    最近更新 更多