我在这里使用specdata遇到了这个问题,这是我从https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip获得的。这里的数据集不是问题,但我决定在这里显示链接,以防有人想要查看它。
首先,我试图手工计算硝酸盐或硫酸盐的平均值。对于手动计算部分,我使用硝酸盐代替。 “specdata”文件夹中有332个文件,对于下面的情况,我只是使用ID 23
#manual coding first
dat <- data.frame()
files <- list.files("specdata", full.names = T)
id <- 23
for (i in 23){
dat <- rbind(dat, read.csv(files[i]))
}
datsubset <- subset(dat, dat$ID == id)
#start here
pollutant <- subset(dat, dat$nitrate > 0, select = c("nitrate"))#problem is here
mean(datsubset[, "pollutant"], na.rm = T)
这就是我的头部(dat)的样子。
head(dat)
Date sulfate nitrate ID
1 2002-01-01 NA NA 23
2 2002-01-02 NA NA 23
3 2002-01-03 NA NA 23
4 2002-01-04 NA NA 23
5 2002-01-05 NA NA 23
6 2002-01-06 NA NA 23
根据我的理解,我已成功对data.frame进行了子集化,以仅显示ID = 23的行。
我面临的问题是将data.frame转换为数字形式,用于污染物变量。
mean(datsubset [,“污染物”],na.rm = T)
[.data.frame
(datsubset,“污染物”)中的错误: 选择了未定义的列
如果我用....替换最后两行代码
#manual coding first
dat <- data.frame()
files <- list.files("specdata", full.names = T)
id <- 23
for (i in 23){
dat <- rbind(dat, read.csv(files[i]))
}
datsubset <- subset(dat, dat$ID == id)
#start here
##
y <- datsubset[, "nitrate"]# numeric
mean(y, na.rm = T) #works!
所以我的问题是,如何以第一个代码的方式编写我的代码,这使得它有用?
我之所以问这个问题,是因为我不能让手动编码方式起作用,我不可能让这个功能起作用。如果有人有兴趣,这就是我创建的功能。
#mean for pollutant with id
pollutantmean <- function(directory, pollutant, id = 1:332){
dat <- data.frame()
files <- list.files(directory, full.names = T)
for (i in id){
dat <- rbind(dat, read.csv(files[i]))
}
datsubset <- subset(dat, dat$ID == id)
mean(datsubset[, "pollutant"], na.rm = T) # error here!
}
在我尝试使用该功能后,我收到了类似的错误,污染物量(“specdata”,“硝酸盐”,23)
[.data.frame
(datsubset,“污染物”)出错: 选择了未定义的列
如果有人能指出我正确的方向/读数,我将不胜感激!
更新2: 我决定采用我理解的[]并决定使用if else语句,而不是太努力让子集工作。
pollutantmean <- function(directory, pollutant, id = 1:332){
dat <- data.frame()
files <- list.files(directory, full.names = T)
for (i in id){
dat <- rbind(dat, read.csv(files[i]))
}
datsubset <- subset(dat, dat$ID == id)
if (pollutant == "nitrate"){
mean(datsubset[, "nitrate"], na.rm = T)
}else {
mean(datsubset[, "sulfate"], na.rm = T)
}
}
如果有人能理解我的挣扎,请随时在此分享您的想法!谢谢!
答案 0 :(得分:0)
创建变量pollutant
后,您应该在下标[]
中使用该变量。所以只说:
mean(datsubset[, pollutant], na.rm = T)
即。没有引号,因为它只是一个文字字符串。
在功能pollutantmean()
中更改它应该就足够了。