【问题标题】:R read.csv loop with iterating variable in quotation marksR read.csv循环,带引号的迭代变量
【发布时间】:2020-05-14 03:55:02
【问题描述】:

这是我的代码:

library(data.table)
library(stringr)
parameters <- c("conductivity","calcium","chloride","magnesium","phosphate","potassium","salinity","sodium","sulphate")
for (i in parameters){
  i <- read.csv(str_c("./Data/Parameters/",i,".csv"), sep=",", header=FALSE)
  i <- unique(i)
  i <- subset(i, select=c(1,2,4,6))
  i <- setnames(i, c("site","date", str_c("",i,""), "material"))
  i[,3] <- as.numeric(i[,3])
  i <- subset(i, i > 0)
}

现在,有两件事在这里行不通。 第一个在setnames 函数中:它不明白它需要用变量名标记CSV 的列之一。 第二个是它实际上并没有将导入的文件称为“电导率”、“钙”等,而只是将它们都称为“i”。 我该如何解决这个问题?

【问题讨论】:

    标签: r loops data.table stringr read.csv


    【解决方案1】:

    我们可以通过map 做到这一点

    library(stringr)
    library(dplyr)
    library(purrr)
    
    map(parameters, ~ read_csv(str_c("./Data/Parameters/", .x, ".csv")) %>%
                   distinct %>%
                    select(1, 2, 4, 6) %>%
                    rename_at(3, ~  .x) %>%
                    mutate(!! .x := !! rlang::sym(.x)) %>%
                    filter_at(vars(.x), any_vars(. > 0))
               )
    

    【讨论】:

    • 使用列规范解析:cols(R.OUSE A422 RD.BR.BRACKLEY = col_character(), 2000-01-24T10:55:00 = col_datetime(format = ""), Conductivity at 25 C = col_character(), 812 = col_double() , us/cm = col_character(), RIVER / RUNNING SURFACE WATER = col_character(), ENVIRONMENTAL MONITORING STATUTORY (EU DIRECTIVES) = col_character(), 459427 = col_double(), 236819 = col_double() )
    • 警告:8872 解析失败。 row col 预期实际文件 652814 2000-01-24T10:55:00 日期如 18/11/2016 './Data/Parameters/conductivity.csv' 652815 2000-01-24T10:55:00 日期如 06/12/2016 './Data/Parameters/conductivity.csv' 652816 2000-01-24T10:55:00 日期如 06/12/2016 './Data/Parameters/conductivity.csv' 652817 2000-01-24T10:55:00 日期像 05/01/2017 './Data/Parameters/conductivity.csv' 652818 2000-01-24T10:55:00 日期像 20/01/2017 './Data/Parameters/conductivity.csv' 查看问题(.. .) 了解更多详情。
    • 错误:找不到对象“电导率”
    • @NicolaGambaro 这可能是因为。你没有。那个同名的文件
    • 我肯定会这样做
    【解决方案2】:

    另一个使用data.table的选项:

    library(data.table)
    parameters <- c("conductivity","calcium","chloride","magnesium","phosphate",
        "potassium","salinity","sodium","sulphate")
    lapply(parameters, function(x) {
        DT <- unique(fread(paste0("./Data/Parameters/", x, ".csv"), header=FALSE))[,
            V4 := as.numeric(V4)][
                V4 > 0, paste0("V", c(1,2,4,6))]
        setnames(DT, names(DT), c("site","date", x, "material"))
    })
    

    【讨论】:

      猜你喜欢
      • 2021-10-23
      • 2019-03-28
      • 2015-11-10
      • 2018-01-02
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 2023-03-24
      相关资源
      最近更新 更多