gpt4 book ai didi

r - 如何在多个 CSV 中测试某些列名是否存在

转载 作者:行者123 更新时间:2023-12-04 08:30:17 25 4
gpt4 key购买 nike

我有大约 60 个 csv我想合并的文件。一个挑战是列的命名不一致,尽管基本上所有文件(应该)具有相同的数据。
为了解决这个问题,我想首先测试哪些文件具有某些列名(哪些没有)。我有一个字符串向量,其中每个元素都反射(reflect)一个列名,要检查它是否存在于每个 csv 文件中。
我正在尝试实现一个具有以下功能的数据框:

  • 栏目 : 每列对应一个列名,我想测试是否存在
  • :每一行对应一个csv文件
  • :在每个单元格中,要么 01标记csv文件是否有列名

  • 例如 3 个 CSV
    library(tidyverse)

    df_1 <-
    tribble(~ date, ~ name, ~ age, ~ gender,
    "2020-11-29", "sarah", 43, "female")

    df_2 <-
    tribble(~ createdAt, ~ person, ~ age, ~ is_female,
    "2020-10-10", "bob", 25, 0)

    df_3 <-
    tribble(~ date, ~ name, ~ age_value, ~ gender,
    "2010-01-07", "wendy", 70, "female")
    write_csv(df_1, "csv_1.csv")
    write_csv(df_2, "csv_2.csv")
    write_csv(df_3, "csv_3.csv")
    带名字的矢量
    现在假设我不知道上面创建的 3 个 CSV 中的列名。我相信每个 CSV 的列名应该是 date , name , age , age_value , gender .
    col_names_to_test <-
    c(
    "date",
    "name",
    "age",
    "age_value",
    "gender"
    )
    解决方案的基础
    这只是我的方向,基于 this nice solution定义阅读和编辑功能,然后使用 list.filespurrr::map_df在定义的函数上。
    read_plus <- 
    function(flnm) {
    read_csv(flnm, col_types = cols(.default = "c")) # %>%
    ## here some testing against the vector `col_names_to_test` ?
    }

    tbl_with_sources <-
    list.files(path = //folder-with-csv-files,
    pattern = "*.csv",
    full.names = TRUE,
    recursive = TRUE) %>%
    map_df(~ read_plus(.))
    这只是一个普遍的想法......我习惯于 tidyverse 方法,但我会对任何解决方案感到满意。
    期望输出
      filename  date  name   age age_value gender
    <chr> <dbl> <dbl> <dbl> <dbl> <dbl>
    1 csv_1 1 1 1 0 1
    2 csv_2 0 0 1 0 0
    3 csv_3 1 0 0 1 1

    最佳答案

    定义一个函数 ok其中给定的文件名 f返回与 col_names_to_test 具有相同长度的命名 0/1 向量如果 col_names_to_test 的对应分量为 1在该文件中作为列名存在,否则为 0。然后定义一个文件名向量 files .给它命名而不带扩展名并应用 ok使用 map_dfr .
    这是相当紧凑的,并且只使用 purrr。

    library(purrr)

    ok <- function(f) +setNames(col_names_to_test %in% names(read.csv(f)), col_names_to_test)
    files <- Sys.glob("csv_*.csv")
    shortnames <- sub("\\.csv$", "", basename(files))
    files %>% setNames(shortnames) %>% map_dfr(ok, .id = "file")
    给予:
    # A tibble: 3 x 6
    file date name age age_value gender
    <chr> <int> <int> <int> <int> <int>
    1 csv_1 1 1 1 0 1
    2 csv_2 0 0 1 0 0
    3 csv_3 1 1 0 1 1
    更新
    已经完全修改。

    关于r - 如何在多个 CSV 中测试某些列名是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65060621/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com