【发布时间】: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"))
【问题讨论】: