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)