pollutantmean <- function(directory, pollutant, ID = 1:332){
+ files_list <- list.files("specdata", full.names = TRUE)
+ dat <- data.frame()
+ for (i in 1:332){
+ dat <- rbind(dat, read.csv(files_list[i]))
+ }
+ dat_subset <- subset(dat, dat$ID == ID)
+ mean(dat_subset$nitrate, na.rm = TRUE)
+ mean(dat_subset$sulfate, na.rm = TRUE)
+ }1 3.189369污染平均(硝酸盐,70:72) 1 3.189369污染平均(“规格数据”,“硫酸盐”,1:10) 1 3.189369
发布于 2017-10-24 10:27:28
我认为问题是因为dat不存在,所以我们可以尝试:
if(exist("dat")== FALSE){
dat <- read.csv(i)
}else{
dat <- rbind(dat, read.csv(files_list[i]))
}发布于 2017-10-24 11:05:50
您所观察到的行为是由行引起的。
dat_subset <- subset(dat, dat$ID == ID)subset将在第一个参数中查找第二个参数中的任何变量。因此,当您说dat$ID == ID时,它首先在dat中查找ID。因为dat有一个名为ID的元素,所以它等同于表示dat$ID == dat$ID。因此,您实际上没有得到数据的子集;您使用的是完整的数据集。
为了说明,让我们使用mtcars数据集。此数据集有32行。其中一个列名为am,它由值0和1组成,指示车辆是自动变速器还是手动变速器。
nrow(mtcars)
[1] 32让我们在am上定义一个子集am的向量
am <- 0当我们对am进行子集时,我们只想在mtcars中得到am == 0中的那些行。
nrow(subset(mtcars, mtcars$am %in% am))
[1] 32不过,这似乎不管用。注意,如果使用下一行,则得到相同的结果。
nrow(subset(mtcars, am %in% am))
[1] 32现在,让我们更改我们的子集向量的名称,看看会发生什么。
am_list <- 0
nrow(subset(mtcars, am %in% am_list))
[1] 19在本例中,subset没有在mtcars中找到一个名为am_list的列,因此它在mtcars之外查找一个名为am_list的对象。这种行为是?subset中警告背后的原因之一
这是一个便于交互使用的功能。对于编程来说,最好使用[这样的标准子集设置函数,特别是参数子集的非标准计算可能会产生意想不到的后果。
我认为你最好用这种方式写你的函数(我冒昧地重写了它)。
pollutantmean <- function(directory, pollutant, ID = 1:332){
# Get file names from directory argument
files_list <- list.files(directory, full.names = TRUE)
# Create a single data frame from all of the files
dat <- lapply(files_list,
read.csv)
dat <- do.call("rbind", dat)
# Subset the data appropriately
dat_subset <- dat[dat$ID %in% ID, ]
# Get the mean of the two columns, return in a list
lapply(dat_subset[c("nitrate", "sulfate")],
mean,
na.rm = TRUE)
}https://stackoverflow.com/questions/46907607
复制相似问题