代码之家  ›  专栏  ›  技术社区  ›  Shubh

如何更正“if”函数中长度大于1的警告条件?[重复]

csv r
  •  0
  • Shubh  · 技术社区  · 7 年前

    我制作了一个函数,可以从文件列表中读取输入,并使用rbind将其追加。

    dat <- NA
    file.names <- list.files(paste(in.path2,"CSV",sep =""))
    for(f in file.names){
      file <- paste(in.path2,"CSV/", f, sep = "")
      tmp <- read.csv(file, stringsAsFactors = F, na.strings = c("", " "))
    
      if (is.na(dat)) {
        dat <- tmp
      } else {
        colnames(tmp) <- colnames(dat)
        dat <- rbind(dat, tmp)
      }
      print(f)
    }
    

    我收到以下警告:

     1: In if (is.na(dat)) { ... :
      the condition has length > 1 and only the first element will be used.
    

    如何更正此问题?

    2 回复  |  直到 7 年前
        1
  •  1
  •   Linus    7 年前

    我强烈建议不要增加您的数据。像那样但像这样

    file.names <- list.files(paste(in.path2,"CSV",sep =""))
    input_list <- list()
    for(f in file.names){
      file <- paste(in.path2,"CSV/", f, sep = "")
      input_list[[f]] <- read.csv(file, stringsAsFactors = F, na.strings = c("", " "))
      print(f)
    }
    dat <- do.call(rbind, input_list)
    

    这要快得多,您不需要测试dat是否为。是否不适用

        2
  •  1
  •   akrun    7 年前

    我们可以更轻松地使用 lapply 不用担心 NA 以及 if/else 条款

    filenames <- list.files(paste0(in.path2,"CSV"), full.names = TRUE)
    do.call(rbind,lapply(filenames, read.csv, na.strings = c("", " "), stringsAsFactors = FALSE))
    

    或者另一种选择是 fread 从…起 data.table

    library(data.table)
    rbindlist(lapply(filenames, fread, na.strings = c("", " ")), fill = TRUE)
    

    或与 tidyverse

    library(tidyverse)
    map_df(filenames, read_csv, na = c("", " "))
    

    如果列不相同,则

    map(filenames, read_csv, na = c("", " ")) %>%
          bind_rows