2016-08-05 48 views
-1

我试图在R中计算硝酸盐,硫酸盐和ID的平均值。我的原始数据框有4列(日期,硝酸盐,亚硫酸盐,ID)。所以,我设计了一个代码没有错误,但没有结果在R

prueba<-read.csv("C:/Users/User/Desktop/coursera/001.csv",header=T) 

columnmean<-function(y, removeNA=TRUE){ #y will be a matrix 
    whichnumeric<-sapply(y, is.numeric)#which columns are numeric 
    onlynumeric<-y[ , whichnumeric] #selecting just the numeric columns 
    nc<-ncol(onlynumeric) #lenght of onlynumeric 
    means<-numeric(nc)#empty vector for the means 
     for(i in 1:nc){ 
      means[i]<-mean(onlynumeric[,i], na.rm = TRUE) 
     } 



} 

columnmean(prueba) 

当我跑我的数据,而不使用()的函数,但我按行使用行用我的数据,它会给我的平均值。尽管如此,如果我尝试使用该函数以便它自己完成所有步骤,它将不会标记我错误,但它也不会计算任何值,如我的环境中的数据框“prueba”和列函数

我究竟做错了什么?

+4

请不要发布代码来清除工作区并关闭图形设备,除非它们是问题的关键部分。 – Gregor

+0

@格雷戈尔工作区,走了! :'( –

回答

2

A reproducible example会很好(虽然在这种情况下不是绝对必要的)。

你需要在函数的最后一行最后一行return(means)。 (有些老派[R用户维护单独means是OK - R的自动返回return()是否指定或不函数中最后计算的表达式的值 - 但我觉得用return()明确是更好的做法)

colMeans(y[sapply(y, is.numeric)], na.rm=TRUE) 

是一种稍微更紧凑的方式来实现您的目标(尽管如果让代码更易于阅读和理解,稍微冗长一点就没有问题)。

0

R函数的结果是最后一个表达式的值。你的最后一个表达式是:

for(i in 1:nc){ 
      means[i]<-mean(onlynumeric[,i], na.rm = TRUE) 
     } 

它可能看起来奇怪的是,该表达式的值为NULL,但是这是与R. for循环的means载体被弄顺序改变了,这意味着BenBolker的建议使用return(.)是正确的(因为他的建议几乎总是)。 R中的For循环是函数式编程范例的一个显着例外。它们提供循环机制(与各种应用函数一样),但循环内的命令通过副作用在调用环境中发挥作用(与应用函数不同)。

相关问题