理解 data.frame 和转换为数字形式的问题

Issues understanding data.frame and conversion to a numeric form

我在使用 specdata 时遇到了这个问题,这是我从 https://d396qusza40orc.cloudfront.net/rprog%2Fdata%2Fspecdata.zip 获得的。这里的数据集不是问题,但我决定在这里显示 link 以防有人想查看它。

首先,我正在尝试手动计算硝酸盐或硫酸盐的平均值。对于手动计算部分,我使用硝酸盐代替。 "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[, "pollutant"], na.rm = T) Error in [.data.frame(datsubset, , "pollutant") : undefined columns selected

如果我将最后两行代码替换为....

#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!
}

我在尝试使用函数 pollutantmean("specdata", "nitrate", 23) [=21= 后收到了与上述类似的错误]

Error in [.data.frame(datsubset, , "pollutant") : undefined columns selected

如果有人能为此指出正确的 direction/readings,我将不胜感激!

更新 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)
  }
}

如果有人能理解我的挣扎,请随时在这里分享您的想法!谢谢!

创建变量 pollutant 后,您应该在下标 [] 中使用该变量。所以就说:

mean(datsubset[, pollutant], na.rm = T)

即没有引号,因为否则它只是一个文字字符串。

在您的函数 pollutantmean() 中更改它应该就足够了。