r中多列的子集

时间:2014-08-07 09:59:10

标签: r subset

我是一名学生拿着R.我的目录里面有很多文件。 我需要写一个名为'pollutantmean'的函数来计算数据集中污染物(硫酸盐或硝酸盐)的平均值(见下面的例子) 该函数有三个参数:'directory','污染物'和'id'。

作为我的函数的一部分,我已成功读取所有文件并将它们放入单个文件中,以便我现在可以进行一些计算,如中位数,平均值等。 我使用rbind和for循环来创建data.frame。

但问题是,在创建数据框后,我现在需要找到一种方法,通过数据框中的一列或多列(第2列或第3列)

对我的数据进行子集化。

我得到的功能原型如下:

pollutantmean< - function(directory,pollutant,id = 1:332){##'directory'是长度为1的字符向量,表示CSV文件的位置##'污染物'是长度的字符向量1表示我们将计算平均值的污染物名称; “硫酸盐”或“硝酸盐”。 ##'id'是一个整数向量,表示要使用的监视器ID号##返回'id'向量中所有监视器列表中污染物的平均值(忽略NA值)

以下是此函数输出的示例:

pollutantmean("specdata", "sulfate", 1:10)
## [1] 4.064
pollutantmean("specdata", "nitrate", 70:72)
## [1] 1.706
pollutantmean("specdata", "nitrate", 23)
## [1] 1.281

这是我作为第一个实验,只使用一个ID和一种污染物类型(硫酸盐)

pollutantmean <- function(directory, pollutant, ID = 1:332) {
         data <- read.csv("specdata/001.csv")
         subset(data, data$ID == 1)
         mean(data$sulfate, na.rm = TRUE)
}
pollutantmean("specdata", "sulfate", 1)
[1] 3.880701

我无法弄清楚怎么做才能计算污染物类型的平均值,无论是'硫酸盐'还是'硝酸盐'

有人可以就我的后续步骤提供一些建议吗?

这是我的数据的一个例子

"Date","sulfate","nitrate","ID"
"2003-01-01",NA,NA,1
"2003-01-02",NA,NA,1
"2003-01-03",NA,NA,1
"2003-01-04",NA,NA,1
"2003-01-05",NA,NA,1

2 个答案:

答案 0 :(得分:0)

我认为以下内容对您有所帮助..它也可以帮助您进行子集化...

mean(data[data$ID %in% id,pollutant],na.rm=T)

答案 1 :(得分:0)

以下方法可能会有所帮助:

ddf = structure(list(Date = structure(1:5, .Label = c("2003-01-01", 
"2003-01-02", "2003-01-03", "2003-01-04", "2003-01-05"), class = "factor"), 
    sulfate = c(50L, 75L, 85L, 45L, 25L), nitrate = c(854L, 658L, 
    485L, 458L, 152L), ID = c(1L, 1L, 2L, 1L, 2L)), .Names = c("Date", 
"sulfate", "nitrate", "ID"), class = "data.frame", row.names = c(NA, 
-5L))

ddf
        Date sulfate nitrate ID
1 2003-01-01      50     854  1
2 2003-01-02      75     658  1
3 2003-01-03      85     485  2
4 2003-01-04      45     458  1
5 2003-01-05      25     152  2

ddfm = melt(ddf[,2:4], id="ID")
ddfm
   ID variable value
1   1  sulfate    50
2   1  sulfate    75
3   2  sulfate    85
4   1  sulfate    45
5   2  sulfate    25
6   1  nitrate   854
7   1  nitrate   658
8   2  nitrate   485
9   1  nitrate   458
10  2  nitrate   152


with(ddfm, tapply(value, list(variable, ID), mean))

                1     2
sulfate  56.66667  55.0
nitrate 656.66667 318.5