I've been working on an assignment where I have to read in some csv files from a directory "specdata". The files are very similar in that there are 332 titled 001.csv - 332.csv. They have consistent columns and headers, if that matters.
I believe I'm close but am tripping up with the above error message
" Error in
[.data.frame
(data1, good) : undefined columns selected"
I had expected a data frame to load with all the data specified by the subset of files in id parameter.
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)
Are you meaning?
data2 <- data1[good,]
With
data1[good]
you're selecting columns in a wrong way (using a logical vector of complete rows).
Consider that parameter pollutant
is not used; is it a column name that you want to extract? if so it should be something like
data2 <- data1[good, pollutant]
Furthermore consider that you have to rbind
the data.frame
s inside the for
loop, otherwise you get only the last data.frame (its completed.cases)
And last but not least, i'd prefer generating filenames eg with
id <- 1:322
paste0( directory, "/", gsub(" ", "0", sprintf("%3d",id)), ".csv")
A little modified chunk of ?sprintf
The string fmt
(in our case "%3d"
) contains normal characters, which are passed through to the output string, and also conversion specifications which operate on the arguments provided through ...
. The allowed conversion specifications start with a %
and end with one of the letters in the set aAdifeEgGosxX%
. These letters denote the following types:
d
: integerEg a more general example
sprintf("I am %10d years old", 25)
[1] "I am 25 years old"
^^^^^^^^^^
| |
1 10
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With