将目录中包含特定文本的多个 csv 文件读取到 r

问题描述 投票:0回答:2

我已将一组 .csv 文件从目录导入到如下列表文件中。

features <- c("ASB_aggregated_by_lsoa_2015.csv",  "ASB_aggregated_by_lsoa_2019.csv",  "ASB_aggregated_by_lsoa_2022.csv", "Bicycle_theft_aggregated_by_lsoa_2015.csv",  "Bicycle_theft_aggregated_by_lsoa_2019.csv", "Bicycle_theft_aggregated_by_lsoa_2022.csv",  "Burglary_aggregated_by_lsoa_2015.csv", "Burglary_aggregated_by_lsoa_2019.csv",  "Burglary_aggregated_by_lsoa_2022.csv", "Criminal_damage_and_arson_aggregated_by_lsoa_2015.csv",  "Criminal_damage_and_arson_aggregated_by_lsoa_2019.csv", "Criminal_damage_and_arson_aggregated_by_lsoa_2022.csv",  "Drugs_aggregated_by_lsoa_2015.csv", "Drugs_aggregated_by_lsoa_2019.csv",  "Drugs_aggregated_by_lsoa_2022.csv",  "Other_crime_aggregated_by_lsoa_2015.csv", "Other_crime_aggregated_by_lsoa_2019.csv",  "Other_crime_aggregated_by_lsoa_2022.csv", "Other_theft_aggregated_by_lsoa_2015.csv",  "Other_theft_aggregated_by_lsoa_2019.csv", "Other_theft_aggregated_by_lsoa_2022.csv")

每年的档案都有类似的栏目,但每个档案的案件数量不同。首先,我想将相似年份(2015 年、2019 年和 2022 年)的所有文件合并到同一个数据框中,并根据它们的相似列进行完整连接。最后,我每年都会有 3 个数据框。

谢谢你

r
2个回答
0
投票

首先设置一些测试文件并创建

features
。现在将文件读入
DFs
并创建一个
years
向量,该向量给出
DFs
中每个条目的相应年份,通过
DFs
拆分
years
给出
spl
。然后对于拆分的每个组件执行合并。

# set up test files
for(year in c(2015, 2019, 2022))
  for(let in letters[1:3])
    write.csv(BOD + year + match(let, letters), paste0("BOD-", year, let, ".csv"),
      row.names = FALSE, quote = FALSE)
features <- dir()

# we now have features and the test files so process them
DFs <- Map(read.csv, features)
years <- gsub("\\D", "", features)
spl <- split(DFs, years)
L <- lapply(spl, \(x) Reduce(function(x, y) merge(x, y, by="Time", all=TRUE), x))

str(L) # show structure of result

给予:

List of 3
 $ 2015:'data.frame':   9 obs. of  4 variables:
  ..$ Time    : int [1:9] 2017 2018 2019 2020 2021 2022 2023 2024 2025
  ..$ demand.x: num [1:9] 2024 2026 2035 2032 2032 ...
  ..$ demand.y: num [1:9] NA 2025 2027 2036 2033 ...
  ..$ demand  : num [1:9] NA NA 2026 2028 2037 ...
 $ 2019:'data.frame':   9 obs. of  4 variables:
  ..$ Time    : int [1:9] 2021 2022 2023 2024 2025 2026 2027 2028 2029
  ..$ demand.x: num [1:9] 2028 2030 2039 2036 2036 ...
  ..$ demand.y: num [1:9] NA 2029 2031 2040 2037 ...
  ..$ demand  : num [1:9] NA NA 2030 2032 2041 ...
 $ 2022:'data.frame':   9 obs. of  4 variables:
  ..$ Time    : int [1:9] 2024 2025 2026 2027 2028 2029 2030 2031 2032
  ..$ demand.x: num [1:9] 2031 2033 2042 2039 2039 ...
  ..$ demand.y: num [1:9] NA 2032 2034 2043 2040 ...
  ..$ demand  : num [1:9] NA NA 2033 2035 2044 .

0
投票

您可以通过使用文件名创建数据框,提取年份(例如

mutate(year=str_extract(filename,"20[0-9]+"))
),然后继续使用
group_by(year)
map_dfr()
对分组数据框执行其他操作来完成您想做的事情。这将为您提供一个包含年份的单个数据框,您可以手动对其进行子集化。 如果没有这些文件或至少不知道其结构,就很难了解更多细节。另外,您似乎有 2011 年和 2021 年的
"Census_combined_data"
,但没有这些年份的其他数据,这当然会破坏工作流程,因为您丢失了文件并且拥有具有不同结构的文件。

© www.soinside.com 2019 - 2024. All rights reserved.