数据框中出现错误,选择了未定义的列。

7
我一直在做一个任务,需要从目录"specdata"中读取一些csv文件。这些文件非常相似,共有332个,分别命名为001.csv - 332.csv。如果有必要,它们具有一致的列和标题。
我相信我已经接近成功了,但是却被上述错误消息所绊住:
“Error in [.data.frame(data1, good) : undefined columns selected”
我原本期望用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个回答

7
你的意思是什么?
data2 <- data1[good,]

使用

data1[good]

您正在错误地选择列(使用完整行的逻辑向量)。

请注意,参数pollutant未被使用; 如果您想要提取的是列名,请像下面这样:

data2 <- data1[good, pollutant]

此外,请注意您必须在for循环内部使用rbind 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

谢谢提供的信息。我在文档中查找了sprintf,但实际上并不理解它。回家后会尝试您的答案。 - Doug Fir
@DougFirr 它生成一个字符向量,每个元素由3个字符组成,右对齐,数字来自id。然后我用0替换所有的左空格。 - Luca Braglia
好的,谢谢。所以在sprintf("%3d")中,"3"预计是向量的长度,但是"d"和"%"是什么意思? - Doug Fir
再次感谢@Luca提供的示例。我现在认为我理解了这个示例中的逻辑。由于这是对我来说新的语言,嵌套公式的使用有些棘手,非常感谢。 - Doug Fir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接