【问题标题】:Reference the column from a dataframe in a list during a for loop在 for 循环期间从列表中的数据框中引用列
【发布时间】:2022-01-20 00:32:46
【问题描述】:

我在循环过滤数据帧时遇到了一些困难。

我正在从 Excel 文件中复制数据,将所有内容放在数据框列表中。我正在尝试进行一些清理,第 8 列 (.periodenddate) 包含一些日期。但是有一些以“Unable...”开头的字符串。所以我试图取出这些行以便能够将数字转换为日期。由于来自 Excel,它们目前看起来像“43890”。

当我将数据框从列表中取出时,我确实找到了一种让它在代码末尾工作的方法,但理想情况下我会将它保留在列表中以循环遍历它。

另外,很遗憾,我无法共享该文件,但它只是包含 15 张以下列的 Excel 文件:ISIN、MAIN、.Date、.Calcdate、.brokername、.fperiod、.rfperiod、.periodenddate、.analystcode , .analystname

library(tidyverse)
library(readxl)

myPath <- "MyFile.xlsm"
sheetsName <- excel_sheets(myPath)

for(a in 1:length(sheetsName)){
  if (!(sheetsName[[a]] %in% c("Isin&Date", "Parameters", "TempSheet","Unique ISIN"))){
    assign(paste0("DT_", sheetsName[[a]]), read_excel(myPath,a))
  }
}

FY <- list() #Was not sure how to make this part cleaner
FY[[1]] <- rbind(`DT_Output FY-1(1)`,`DT_Output FY-1(2)`)
FY[[2]] <- rbind(`DT_Output FY-2(1)`,`DT_Output FY-2(prev)`)
FY[[3]] <- rbind(`DT_Output FY-3(1)`,`DT_Output FY-3(2)`)
FY[[4]] <- rbind(`DT_Output FY-4(1)`,`DT_Output FY-4(2)`,`DT_Output FY-4(prev)`)
FY[[5]] <- rbind(`DT_Output FY-5(1)`,`DT_Output FY-5(2)`)
FY[[6]] <- rbind(`DT_Output FY-6(1)`,`DT_Output FY-6(prev)`)
FY[[7]] <- rbind(`DT_Output FY-7(1)`,`DT_Output FY-7(2)`)
FY[[8]] <- rbind(`DT_Output FY-8(1)`,`DT_Output FY-8(prev)`)

rm(list=setdiff(ls(),"FY"))

for (a in 1:length(FY)){
  FY[[a]] <- subset(FY[[a]],FY[[a]]$MAIN!="NULL")
  FY[[a]] <- distinct(FY[[a]])
  FY[[a]] <- FY[[a]] %>% #part that does not work
    filter(!grepl('able', FY[[a]][8]))
}

#Thing that works:
FYTest <- FY[[1]]
FYTest <- FYTest %>% 
  filter(!grepl('able', FYTest$.periodenddate))

class(FY[[1]][8]) 也给出以下结果: [1] "tbl_df" "tbl" "data.frame"

编辑:

有效的代码:

FY <- excel_sheets(myPath) %>% 
  setdiff(c("Isin&Date", "Parameters", "TempSheet","Unique ISIN")) %>% 
  map(read_excel, path = myPath) %>% 
  bind_rows()

colnames(FY)<- c("ISIN","estEPS","date","calcDate","broker","fPeriod","rfPeriod","periodEnd","analystCode","anlystName")

FY <- FY %>% 
  subset(.,estEPS!="NULL" & periodEnd!="NULL" & !str_detect(periodEnd, "field")) %>% 
  distinct() %>% 
  mutate(., periodEnd = as.Date(as.numeric(periodEnd), origin = "1899-12-30"))

【问题讨论】:

    标签: r dplyr


    【解决方案1】:

    我不太了解您的 Excel 表格是什么样的或您要做什么,但像这样加载它们可能更容易:

    FY <- excel_sheets(myPath) %>% 
        setdiff(c("Isin&Date", "Parameters", "TempSheet","Unique ISIN")) %>% 
        map(read_excel, path = myPath) %>% 
        bind_rows()
    

    这将为您提供一个包含所有数据的 tibble。然后,您可以过滤掉或修复有问题的行。完成后,您可以mutate 转换日期。正如in this answer 解释的那样,您可以使用as.Date(43890, origin = "1899-12-30") 来转换日期。

    【讨论】:

    • 我想来自 Excel 中的工作表,我想保持类似的结构并为每张工作表创建一个数据框,这是一个错误。我将更新我最初的问题以显示我最终使用的代码,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    • 2014-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多