2014-05-14 80 views
-6

很抱歉的坏后开始...一个R函数计算变量的列名的统计

我试图做到这一点:

function(pollutant) 

##some code here 

bad <- is.na(dataset$pollutant) 
mean(dataset$pollutant[!bad]) 

dataset <- read.csv(file, header=TRUE) 

文件有多个污染物作为列名。如果我明确输入污染物名称而不是变量“污染物”,则代码起作用。

例如:

function() 

##some code here 

bad <- is.na(dataset$CO2) 
mean(dataset$CO2[!bad]) 

什么是正确的语法,所以我可以有一个变量污染物的名字吗?

+3

问题在哪里? –

回答

1

你似乎在问如何使用作为参数传递给函数的列名?

myfunction <- function(df, col) mean(df[,col], na.rm=T) 

# test 
set.seed(1) 
df <- data.frame(x=rnorm(10),y=rnorm(10)) 
myfunction(df,"x") 
# [1] 0.1322028 

这也适用于如果您传递列号。

myfunction(df,1) 
# [1] 0.1322028 
+0

谢谢,作品完美! – Economist

0

您不妨考虑避免写一个函数,只是使用with功能中的R

> DF 
# col1 pollutant 
# 1 1   4 
# 2 2   5 
# 3 3  NA 
# 4 4   7 
# 5 5   8 
# 6 6  NA 

> with(DF, mean(pollutant, na.rm = TRUE)) 
# [1] 6 

> with(DF, mean(col1, na.rm = TRUE)) 
# [1] 3.5 

如果你想有一个功能,你可以通过列直接到功能,

f <- function(column){ 
    mean(column, na.rm = TRUE) 
} 

> f(DF[, 'pollutant']) 
# [1] 6 

甚至在...的自定义函数参数中传递na.rm作为参数。如果你要在你的函数中进行多个计算,并且需要使用相同的参数,这会更容易。

f2 <-function(column, ...){ 
    list(mean = mean(column, ...), 
     stDev = sd(column, ...), 
     var = var(column, ...)) 
} 

> f2(DF[, 'pollutant'], na.rm = TRUE) 
# $mean 
# [1] 6 

# $stDev 
# [1] 1.825742 

# $var 
# [1] 3.333333