所以我需要帮助我目前正在做的一个项目。我想做的是在一个循环中阅读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()
}
字符串
1条答案
按热度按时间jobtbby31#
如果没有一个最小的可重复的例子,复制原始帖子并不容易。因此,我们将尽最大努力通过使用9代神奇宝贝的数据文件来开发解决方案。
我们说明了如何计算每个文件中唯一的神奇宝贝ID的数量,并将它们与包含一组生成标识符的另一个文件合并,以便最终输出具有生成标识符 Dataframe 中每行的一行数据。
这是一个Base R解决方案,不需要额外的包。
首先,我们将从GitHub存储库下载包含九代Pokémon的zip文件,并
unzip()
该文件以提取其中包含的九个CSV文件。字符串
我们使用
list.files()
创建一个向量,其中包含需要从磁盘读取的文件的完整路径名。型
接下来,为了模拟原始文章中的ID合并,我们将创建一个生成ID值的 Dataframe ,其中该文件中的一些ID与我们下载的数据匹配,至少有一个不匹配。
型
在这里,我们使用
lapply()
和匿名函数来读取每个文件,计算每个文件中唯一的国家Pokédex编号的数量。为了说明,有一些文件,其中相同的神奇宝贝在文件中不止一个,我们还将计算每个数据文件中的总行数。我们将计算出的对象转换为 Dataframe ,并从匿名函数返回,因此当
lapply()
完成时,它是一个 Dataframe 列表。型
在这里,我们使用
do.call()
将 Dataframe 合并为单个 Dataframe ,因此我们可以使用merge()
将结果与idData
Dataframe 合并。型
打印文件以显示它有9行,并且某些文件中的唯一ID较少。例如,第3代文件包含4种形式的Castform和4种形式的Deoxys,因此该文件的唯一ID应该比文件中的行少6个。
型
最后,我们合并两个 Dataframe 并指定
all.x = TRUE
参数,以便将idData
Dataframe 中的所有行包含在输出中,并丢弃results
中与idData
中的genId
字段不匹配的行。型
...和输出:
型