循环列出带有 NA 的文件名

Loop to list names of files with NAs

我有一个名为“Holder”的文件夹,里面有一个文件列表。我正在尝试编写一个循环来遍历文件列表,并将包含 NA 的文件名添加到向量(称为“FileList”)中。当我在一个我知道有 NA 的文件上检查我的语句“sum(is.na(Orig))>=1”时,它 returns“TRUE”。但是,当我获取脚本时,我的向量 returns “logical(0)”。我在这里错过了什么?

setwd("/Users/.../Desktop/NAs")
fileNames <- Sys.glob("*.csv")
fileNumbers <- seq(fileNames)
FileList<-vector()

for (fileNumber in fileNumbers) {
  Orig <- read.csv(fileNames[fileNumber],
                       header = TRUE,
                       sep = ",")
    
  if (sum(is.na(Orig))>=1) {
    append(fileNames[fileNumber], FileList)
  }}

也尝试了下面的方法,结果相同:

  if (sum(is.na(Orig$D_postIAT))>=1) {
    append(fileNames[fileNumber], FileList)
  } else if (sum(is.na(Orig$D_preIAT))>=1) {
    append(fileNames[fileNumber], FileList)
  }

这里有一些问题。

  1. 你想要 seq_along(),而不是 seq()seq() 需要数字参数。
fileNumbers <- seq_along(fileNames)
  1. vector() 默认创建一个逻辑向量,但你想要一个字符向量。
FileList<-vector(mode = “character”)
  1. 您需要分配每个append()的结果。除了极少数例外(R6 类 之外),R 中的对象不会就地修改。

  2. 您的论点是倒退的:append() 将对象作为 附加到,然后是要附加的对象。

  3. 最后,你可以简化 您的代码使用 any() 而不是 sum() >= 1,并结合 两个 if 子句用 or 合二为一。所以尝试:

if (any(is.na(Orig$D_postIAT)) || any(is.na(Orig$D_preIAT))) {
    FileList <- append(FileList , fileNames[fileNumber])
  }