发布了解data.frame和转换为数字表单的问题

时间:2018-02-07 12:18:22

标签: r csv read.csv

我在这里使用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)
  }
}

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

1 个答案:

答案 0 :(得分:0)

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

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

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

在功能pollutantmean()中更改它应该就足够了。