理解 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()
中更改它应该就足够了。
我在使用 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()
中更改它应该就足够了。