我们从数据记录器获取地下水深度数据作为.txt文件。此数据的格式不可更改。它具有一致的列名,除了第一列名称包含井ID。对于每口井,数据结构如下:
"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的colnames = well_id,obs_date,观察
请注意,文件名也包含井号。
到目前为止......
txt_list <- list.files(pattern = ".txt", full.names = TRUE)
txt_read_csv <- map(txt_list,read_csv, col_names = TRUE, col_types = "iTdc")
...给我一个单词列表。但我无法弄清楚如何选择和改变列表中的元组以减少列并分配ID。我尝试了map_df,但由于每个.txt中的第一个列名称不同,因此df会爆炸成一个宽表,每个不同的colname都有多列。
我可以用循环来做到这一点,但我真的想保持整洁。
答案 0 :(得分:0)
尝试创建包装readr::read_csv
的自定义函数,该函数可以读取数据,将井ID添加为新列,然后选择并重命名所需的列。然后,您可以使用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)