R 读取多个 csv 并使用 readr/tidy 添加 ID 密钥
R read multiple csv's and add ID key with readr/tidy
我们从数据记录器中获取地下水深度数据作为 .txt 文件。此数据的格式不可更改。它具有一致的列名,除了第一个列名包含井号。对于每口井,数据结构化:
"well 02,Time,Current(feet),Serial Number
1,2018-02-11 11:18:44,-5.00,020013603
2,2018-02-11 17:18:44,7.30
3,2018-02-11 23:18:44,5.40
4,2018-02-12 05:18:44,0.80
5,2018-02-12 11:18:44,12.60... "
"Well 17,Time,Current(feet),Serial Number
1,2018-02-11 00:32:01,-5.00,000025390
2,2018-02-11 06:32:01,5.45
3,2018-02-11 12:32:01,5.40
4,2018-02-11 18:32:01,5.40..."
我正在尝试创建一个脚本,将多个 csv .txt 文件合并到一个长数据框中。我只需要这些文件中的第 2 列和第 3 列。我还需要添加一个 id 列,指出观察来自哪个井。最后,我希望有一个 3xn df with colnames = well_id, obs_date, observation
请注意,文件名还包含孔 ID。
到目前为止...
txt_list <- list.files(pattern = ".txt", full.names = TRUE)
txt_read_csv <- map(txt_list,read_csv, col_names = TRUE, col_types = "iTdc")
...给我一份 tibbles 列表。但我无法弄清楚如何 select 和改变列表中的小标题以减少列并分配一个ID。我试过 map_df,但由于每个 .txt 中的第一列名称不同,df 会爆炸成一个宽 table,每个不同的列名称都有多个列。
我可以用一个循环来做到这一点,但我真的很想保持它整洁。
尝试创建一个包含 readr::read_csv
的自定义函数,它可以读取数据、将井 ID 添加为新列,以及 select 并重命名您需要的列。然后你可以使用 map_dfr
将这个函数应用到你的每个文件,最后加入它们(按行)。
library(readr)
library(dplyr)
read_wells_csv <- function(filepath){
df <- read_csv(filepath, col_names = TRUE, col_types = "iTdc")
well_id <- colnames(df)[1]
df %>%
mutate(well_id = well_id) %>%
rename(obs_date = Time, observation = `Current(feet)`) %>%
select(well_id, obs_date, observation)
}
txt_list <- list.files(pattern = ".txt", full.names = TRUE)
txt_read_csv <- map_dfr(txt_list, filepath)
我们从数据记录器中获取地下水深度数据作为 .txt 文件。此数据的格式不可更改。它具有一致的列名,除了第一个列名包含井号。对于每口井,数据结构化:
"well 02,Time,Current(feet),Serial Number
1,2018-02-11 11:18:44,-5.00,020013603
2,2018-02-11 17:18:44,7.30
3,2018-02-11 23:18:44,5.40
4,2018-02-12 05:18:44,0.80
5,2018-02-12 11:18:44,12.60... "
"Well 17,Time,Current(feet),Serial Number
1,2018-02-11 00:32:01,-5.00,000025390
2,2018-02-11 06:32:01,5.45
3,2018-02-11 12:32:01,5.40
4,2018-02-11 18:32:01,5.40..."
我正在尝试创建一个脚本,将多个 csv .txt 文件合并到一个长数据框中。我只需要这些文件中的第 2 列和第 3 列。我还需要添加一个 id 列,指出观察来自哪个井。最后,我希望有一个 3xn df with colnames = well_id, obs_date, observation
请注意,文件名还包含孔 ID。
到目前为止...
txt_list <- list.files(pattern = ".txt", full.names = TRUE)
txt_read_csv <- map(txt_list,read_csv, col_names = TRUE, col_types = "iTdc")
...给我一份 tibbles 列表。但我无法弄清楚如何 select 和改变列表中的小标题以减少列并分配一个ID。我试过 map_df,但由于每个 .txt 中的第一列名称不同,df 会爆炸成一个宽 table,每个不同的列名称都有多个列。
我可以用一个循环来做到这一点,但我真的很想保持它整洁。
尝试创建一个包含 readr::read_csv
的自定义函数,它可以读取数据、将井 ID 添加为新列,以及 select 并重命名您需要的列。然后你可以使用 map_dfr
将这个函数应用到你的每个文件,最后加入它们(按行)。
library(readr)
library(dplyr)
read_wells_csv <- function(filepath){
df <- read_csv(filepath, col_names = TRUE, col_types = "iTdc")
well_id <- colnames(df)[1]
df %>%
mutate(well_id = well_id) %>%
rename(obs_date = Time, observation = `Current(feet)`) %>%
select(well_id, obs_date, observation)
}
txt_list <- list.files(pattern = ".txt", full.names = TRUE)
txt_read_csv <- map_dfr(txt_list, filepath)