【问题标题】:R read multiple csv's and add ID key with readr/tidyR读取多个csv并使用readr/tidy添加ID键
【发布时间】:2018-04-08 17:08:34
【问题描述】:

我们从数据记录器中以 .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,colnames = well_id, obs_date,observation

请注意,文件名还包含井号。

到目前为止...

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 都有多个列。

我可以通过循环来做到这一点,但我真的很想保持整洁。

【问题讨论】:

  • 解决了吗?

标签: r tidyr readr


【解决方案1】:

尝试创建一个包含readr::read_csv 的自定义函数,该函数可以读取数据,将井号添加为新列,并选择并重命名您需要的列。然后您可以使用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)

【讨论】:

    猜你喜欢
    • 2017-10-17
    • 2017-09-26
    • 2017-07-08
    • 2018-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-24
    • 2021-05-11
    相关资源
    最近更新 更多