【问题标题】:How to rbind many xlsx files with start and end如何使用开始和结束来绑定许多 xlsx 文件
【发布时间】:2021-05-04 11:29:26
【问题描述】:

我在一个地方有几个文件。我像这样合并它们:

punkty_pgd <- read_xlsx("C:/Users/Desktop/PC- 2021042500.xlsx", sheet = "NEW")
punkty_pgd_2 <- read_xlsx("C:/Users/Desktop/PC- 2021042512.xlsx", sheet = "NEW")
punkty_pgd_3 <- read_xlsx("C:/Users/Desktop/PC- 2021042600.xlsx", sheet = "NEW")
punkty_pgd <- rbind(punkty_pgd, punkty_pgd_2, punkty_pgd_3)

它们的名称中有日期,我想以某种方式限制这种合并,即仅合并名称中具有日期范围的文件:从 date_start 到 date_end

【问题讨论】:

  • 仅供参考,“合并”不是您对 rbind 所做的事情的正确术语:您是行绑定、行连接或只是组合帧。 “合并”操作是一种“连接”操作,您可以在其中匹配帧之间的一列或多列,从而在它们之间产生零或多行配对......请参阅stackoverflow.com/q/1299871/3358272stackoverflow.com/a/6188334/3358272

标签: r xlsx rbind


【解决方案1】:

对于“加载许多文件并处理它们”,一个好的起点是https://stackoverflow.com/a/24376207/3358227

缺少这些,让我们解决文件名/日期的问题。

首先,假设有你不想加载的文件(这一次),那么我们应该首先获取文件的名称。

files <- list.files("c:/Users/Desktop", pattern = "\\.xlsx$", full.names = TRUE)
### add a fake file without a date, for testing
files <- c(files, "Something.xlsx")

files
# [1] "C:/Users/Desktop/PC- 2021042500.xlsx"
# [2] "C:/Users/Desktop/PC- 2021042512.xlsx"
# [3] "C:/Users/Desktop/PC- 2021042600.xlsx"
# [4] "Something.xlsx"                      

现在我们可以通过解析文件名来确定Date 是什么。

files <- cbind(strcapture("\\b([0-9]{10})\\b", files, list(fn = "")), origfn = files)
files
#           fn                               origfn
# 1 2021042500 C:/Users/Desktop/PC- 2021042500.xlsx
# 2 2021042512 C:/Users/Desktop/PC- 2021042512.xlsx
# 3 2021042600 C:/Users/Desktop/PC- 2021042600.xlsx
# 4       <NA>                       Something.xlsx

strcapture 返回一个data.frame,为方便起见,我将其保留在那里。)

files$date <- as.Date(files$fn, format = "%Y%m%d%H")
files
#           fn                               origfn       date
# 1 2021042500 C:/Users/Desktop/PC- 2021042500.xlsx 2021-04-25
# 2 2021042512 C:/Users/Desktop/PC- 2021042512.xlsx 2021-04-25
# 3 2021042600 C:/Users/Desktop/PC- 2021042600.xlsx 2021-04-26
# 4       <NA>                       Something.xlsx       <NA>

现在我们可以只过滤特定日期范围内需要的文件。

  • 基础R:

    dates <- as.Date(c("2021-04-20", "2021-04-25"))
    loadthese <- subset(files, dates[1] <= date & date <= dates[2])
    loadthese
    #           fn                               origfn       date
    # 1 2021042500 C:/Users/Desktop/PC- 2021042500.xlsx 2021-04-25
    # 2 2021042512 C:/Users/Desktop/PC- 2021042512.xlsx 2021-04-25
    list_of_frames <- lapply(loadthese$origfn, readxl::read_xlsx, sheet = "NEW")
    punkty_pgd <- do.call(rbind, list_of_frames)
    
  • tidyverse

    dates <- as.Date(c("2021-04-20", "2021-04-25"))
    punkty_pgd <- files %>%
      filter(between(date, dates[1], dates[2])) %>%
      pull(origfn) %>%
      map_dfr(~ read_xlsx(., sheet = "NEW"))
    

【讨论】:

  • 谢谢,解决方案有效。我还有一个问题,是否可以以某种方式将日期范围限制为不超过 7 天?日期将是变量。
  • 我不确定我是否理解。此答案中当前设计的代码假定为六天,因此如果您更改我的 dates 变量的值,您可以完全控制限制的范围。我误解你的问题了吗?
  • 对不起,我误解了代码。一切都很好,它按我的意愿工作。感谢您的帮助。 :)
猜你喜欢
  • 2016-01-21
  • 1970-01-01
  • 2014-09-16
  • 2017-01-24
  • 2021-04-15
  • 2013-07-31
  • 2013-10-31
  • 2016-07-22
  • 1970-01-01
相关资源
最近更新 更多