选中数据框未定义列时出错

时间:2014-05-14 23:04:43

标签: r

我一直致力于一项任务,我必须从目录“specdata”中读取一些csv文件。这些文件非常相似,共有332个标题为001.csv - 332.csv。如果重要的话,它们具有一致的列和标题。

我相信我已经接近了,但我正在绊倒上述错误消息

  

[.data.frame中的错误(data1,good):选择了未定义的列”

我原本期望一个数据框加载id参数中文件子集指定的所有数据。

pollutantmean <- function(directory, pollutant, id = 1:332) {

              files <- list.files(directory)

              subsetFiles <- files[id]

              for (i in subsetFiles) {

                  filepaths <- paste(directory,"/",i, sep='')

                  data1 <- read.csv(filepaths)
                }

              data1

             good <- complete.cases(data1)

             data2 <- data1[good]

             data2
}

# test it out and ignore middle parameter for now
pollutantmean("specdata", "pass", 1:3)

1 个答案:

答案 0 :(得分:7)

你是什​​么意思?

data2 <- data1[good,]

使用

data1[good]

您以错误的方式选择列(使用完整行的逻辑向量)。

考虑不使用参数pollutant;它是您要提取的列名称吗?如果是这样的话应该是

data2 <- data1[good, pollutant]

此外,请考虑rbind循环内data.frame for,否则只获取最后一个data.frame(其completed.cases)

最后但并非最不重要的是,我更喜欢使用

生成文件名
id <- 1:322
paste0( directory, "/", gsub(" ", "0", sprintf("%3d",id)), ".csv")

?sprintf

的一小块修改过的

字符串fmt(在我们的例子中为"%3d")包含传递给输出字符串的普通字符,以及对提供的参数进行操作的转换规范通过...。允许的转换规范以 %开头,并以集aAdifeEgGosxX%中的一个字母结尾。这些字母表示以下类型:

  • d:整数

例如更一般的例子

    sprintf("I am %10d years old", 25)
[1] "I am         25 years old"
          ^^^^^^^^^^
          |        |
          1       10