R用for循环读取csv文件并添加值

8nuwlpux  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(134)

所以我需要帮助我目前正在做的一个项目。我想做的是在一个循环中阅读90个csv文件。
在这个循环中还有两个功能。函数“Einsatzaufkommen”从csv文件中获取列的唯一数量的值。函数“Einsatzfahrtaufkommen”取同一列的总长度。
这两个函数的结果将把一个值添加到另一个 Dataframe 中(变量名为bast_ansprechpartner_erhebungsstellen)。在该 Dataframe 中,i具有3列和90行(“ID”、“Einsatzaufkommen”和“Einsatzfahrtaufkommen”)。
ID列将始终与90个csv文件的ID列(列名为ERHEBUNGSSTELLE)中的一个值匹配。列Einsatzfahrt和Einsatzfahrtaufkommen当前为空,因为我想在那里添加值。
因此,在阅读90个csv文件中的每一个并应用2个函数之后,我将在ID匹配的行处向列Einsatzaufkommen和Einsatzfahrtaufkommen添加一个值。所以最后的目标是在这2列中填满所有90行,这是我现在的代码:

# This is the dataframe where i want to add all the values(in columns "Einsatzfahrt" and "Einsatzaufkommen")
bast_ansprechpartner_erhebungsstellen <- read_csv2("/Users/pablotrutnau/aktenschrank/Datenbericht/BASt/212-744 Einzelberichte - Beispielordner/BAST_Leistungsanalyse-Ansprechpartner_Erhebungsstellen.csv",
                                                   col_types = "c")

# directory of all the 90 csv files
verzeichnis <- "/Users/pablotrutnau/aktenschrank/Datenbericht/BASt/212-744 Einzelberichte - Beispielordner/Einsatzdaten"

# All csv files in the directory 
datensätze <- list.files(path = verzeichnis, pattern = ".csv", full.names = TRUE)

# start of loop 
for (daten in datensätze){
  # Reading the csv files
  datensatz <- read_csv2(daten, col_types = "c")

# "datensatz" is being renamed to "daten_gefiltert" after applying a function that filters some data of "datensatz" 

# Einsatz- und Einsatzfahrtaufkommen ######################################
  # Function that adds value to bast_ansprechpartner_erhebungsstellen(to column Einsatzaufkommen) 
  einsatzaufkommen <- function(){
    einsätze = round(length(unique(daten_gefiltert$E_NR)), digits = 0)
    # Matches between the IDs
    join_id <- match(bast_ansprechpartner_erhebungsstellen$ID, daten_gefiltert$ERHEBUNGSSTELLE)
    # Value is being added to bast_ansprechpartner_erhebungsstellen at the row where the id matches
    bast_ansprechpartner_erhebungsstellen$Einsatzaufkommen <- ifelse(!is.na(join_id), einsätze, NA)
    return(bast_ansprechpartner_erhebungsstellen)
  }
  
  # Function that adds value to dbast_ansprechpartner_erhebungsstellen(to column Einsatzfahrtaufkommen)   
  einsatzfahrtaufkommen <- function(){
    fahrten = length(daten_gefiltert$E_NR)
    # Matches between the IDs
    join_id <- match(bast_ansprechpartner_erhebungsstellen$ID, daten_gefiltert$ERHEBUNGSSTELLE)
    # Value is being added to bast_ansprechpartner_erhebungsstellen at the row where the id matches
    bast_ansprechpartner_erhebungsstellen$Einsatzfahrtaufkommen <- ifelse(!is.na(join_id), fahrten, NA)
    return(bast_ansprechpartner_erhebungsstellen)
  }

# values are being added to bast_ansprechpartner_erhebungsstellen
  bast_ansprechpartner_erhebungsstellen <- einsatzaufkommen()
  bast_ansprechpartner_erhebungsstellen <- einsatzfahrtaufkommen()
}

字符串

jobtbby3

jobtbby31#

如果没有一个最小的可重复的例子,复制原始帖子并不容易。因此,我们将尽最大努力通过使用9代神奇宝贝的数据文件来开发解决方案。
我们说明了如何计算每个文件中唯一的神奇宝贝ID的数量,并将它们与包含一组生成标识符的另一个文件合并,以便最终输出具有生成标识符 Dataframe 中每行的一行数据。
这是一个Base R解决方案,不需要额外的包。
首先,我们将从GitHub存储库下载包含九代Pokémon的zip文件,并unzip()该文件以提取其中包含的九个CSV文件。

# download and extract files 
download.file("https://raw.githubusercontent.com/lgreski/pokemonData/master/pokemonData.zip",
              "pokemonData.zip",
              method="curl",mode="wb")
unzip("pokemonData.zip")

字符串
我们使用list.files()创建一个向量,其中包含需要从磁盘读取的文件的完整路径名。

thePokemonFiles <- list.files("./pokemonData",
                              full.names=TRUE)


接下来,为了模拟原始文章中的ID合并,我们将创建一个生成ID值的 Dataframe ,其中该文件中的一些ID与我们下载的数据匹配,至少有一个不匹配。

# create a data frame consisting of generation IDs to join
# containing at least one Pokémon generation that is not in the raw data
idData <- data.frame(genId = c("gen01","gen02","gen05","gen10"))


在这里,我们使用lapply()和匿名函数来读取每个文件,计算每个文件中唯一的国家Pokédex编号的数量。为了说明,有一些文件,其中相同的神奇宝贝在文件中不止一个,我们还将计算每个数据文件中的总行数。
我们将计算出的对象转换为 Dataframe ,并从匿名函数返回,因此当lapply()完成时,它是一个 Dataframe 列表。

pokemonDataFiles <- lapply(thePokemonFiles,function(x) {
     y <- read.csv(x,stringsAsFactors=FALSE)
     # create the ID field from the file name parameter
     genId <- substr(x,15,19)
     uniquePokemon <- length(unique(y$ID)) 
     rowsInFile <- nrow(y)
     data.frame(genId,uniquePokemon,rowsInFile)
})


在这里,我们使用do.call()将 Dataframe 合并为单个 Dataframe ,因此我们可以使用merge()将结果与idData Dataframe 合并。

# bind into 1 file 
results <- do.call(rbind,pokemonDataFiles)


打印文件以显示它有9行,并且某些文件中的唯一ID较少。例如,第3代文件包含4种形式的Castform和4种形式的Deoxys,因此该文件的唯一ID应该比文件中的行少6个。

# print the merged data
results

> results
  genId uniquePokemon rowsInFile
1 gen01           151        151
2 gen02           100        100
3 gen03           135        141
4 gen04           107        118
5 gen05           156        165
6 gen06           119        131
7 gen07           110        122
8 gen08           134        147
9 gen09           105        115


最后,我们合并两个 Dataframe 并指定all.x = TRUE参数,以便将idData Dataframe 中的所有行包含在输出中,并丢弃results中与idData中的genId字段不匹配的行。

# merge results so all rows from idData are included
merge(idData,results,all.x = TRUE)


...和输出:

> merge(idData,results,all.x = TRUE)
  genId uniquePokemon rowsInFile
1 gen01           151        151
2 gen02           100        100
3 gen05           156        165
4 gen10            NA         NA

相关问题