【问题标题】:Conditionally read a csv with a given separator and if that separator does not work read.csv using a different separator有条件地读取具有给定分隔符的 csv,如果该分隔符不起作用 read.csv 使用不同的分隔符
【发布时间】:2020-08-17 20:06:28
【问题描述】:

我正在尝试从一些链接下载一些 CSV。大多数 CSV 由 ; 分隔,但是,一个或两个由 , 分隔。运行以下代码:

foo <- function(csvURL){
  downloadedCSV = read.csv(csvURL, stringsAsFactors = FALSE, fileEncoding = "latin1", sep = ";")
  return(downloadedCSV)
}

dat <- purrr::map(links, foo)

给我一​​个包含 3 个data.frame 的列表。其中两个有 2 列(由 ; 分隔符正确读取),其中一个有 1 列(由; 分隔符错误读取),因为此文件使用, 分隔符。

如果列数 == 1 重新读取数据但这次使用 , 而不是 ;,我如何才能将其合并到函数中?我尝试将sep = ";|," 传递给read.csv 函数,但没有运气。

链接数据:

links <- c("https://dadesobertes.gva.es/dataset/686fc564-7f2a-4f22-ab4e-0fa104453d47/resource/bebd28d6-0de6-4536-b522-d013301ffd9d/download/covid-19-total-acumulado-de-casos-confirmados-pcr-altas-epidemiologicas-personas-fallecidas-y-da.csv", 
"https://dadesobertes.gva.es/dataset/686fc564-7f2a-4f22-ab4e-0fa104453d47/resource/b4b4d90b-08cf-49e4-bef1-5608311ce78a/download/covid-19-total-acumulado-de-casos-confirmados-pcr-altas-epidemiologicas-personas-fallecidas-y-da.csv", 
"https://dadesobertes.gva.es/dataset/686fc564-7f2a-4f22-ab4e-0fa104453d47/resource/62990e05-9530-4f2f-ac41-3fad722b8515/download/covid-19-total-acumulado-de-casos-confirmados-pcr-altas-epidemiologicas-personas-fallecidas-y-da.csv"
)

【问题讨论】:

    标签: r


    【解决方案1】:

    我们也可以指定sep作为参数

    foo <- function(csvURL, sep){
       downloadedCSV = read.csv(csvURL, stringsAsFactors = FALSE,
             fileEncoding = "latin1", sep = sep)
        return(downloadedCSV)
        }
    
    lstdat <- map2(links, c(";", ",", ";"), ~ foo(.x, sep=.y))
    

    或者使用data.table中的fread,可以自动拾取分隔符

    foo <- function(csvURL){
       downloadedCSV = data.table::fread(csvURL, encoding = "Latin-1")
       return(downloadedCSV)
     }
    dat <- purrr::map(links, foo)
    

    【讨论】:

    • 谢谢!这要求我使c(";", ",", ";") 的长度与链接数相同。
    • @user113156 是的,如果您知道分隔符是什么。否则,使用fread
    • 好的,谢谢!看起来fread 解决了我的问题!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 2021-10-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多