首页 > 解决方案 > 在用户定义的函数中包含公式

问题描述

假设我想计算每行或每组的特定值(在这个示例问题中,这个值是平均值)我该怎么做?

Personal_mean <- function(observations, data, na.rm){
  #Take obs from data
  observations <- eval(substitute(observations), envir=data)
  #add the observations together
  sum_of_obs <- sum(observations, na.rm=na.rm)
  #adjusts for NA in data 
  if (na.rm==TRUE){
    length_of_obs <- length(observations[!is.na(observations)])
  } else{
    length_of_obs <- length(observations)
  }
# applies above calculations per observation of the object
  m<-0
  for(i in 1:length(observations[!is.na(observations)])){
    m[i]<- sum_of_obs[i]/length_of_obs[i]
  }
  return(m)
}

我想用以下示例数据测试这个函数:

testdata <- data.frame(Gr,O1,O2,O3)
Gr <- c("G1","G2","G3","G4","G5")
O1 <- c(5,7,10,3.5,5)
O2 <- c(4,8,20,NA,3)
O3 <- c(6,NA,18,5.5,2)

所以这应该产生 5,7.5,16,4.5 和 3.3 的平均值基本上我想要这个函数做的是计算每行或每组的平均值,能够处理数据中的 NA,能够从提供的数据。每当我尝试此代码时,我都会得到以下结果:

[1] 7.461538       NA       NA       NA       NA       NA       NA       NA       NA       NA
[11]       NA       NA       NA

那么我在这里做错了什么,它不起作用?

提前致谢!

标签: r

解决方案


这是一个替代方案,尽管不是最好的。您可以根据需要进行重构:

my_mean<-function(data,func,observations,na.rm=F,exc){
m<-as.data.frame(mget(observations,envir = as.environment(data)))
  if(na.rm==T){

  #m[is.na(m)]<-as.numeric(0)
  res1<-apply(m[complete.cases(m),],1,func)
  m<-m[!complete.cases(m),]
  ms[is.na(ms)]<-0
 res2<-rowSums(ms[,-exc])/2
 return(list(res1=res1,res2=res2))
 #res2  contains mean for rows with NAs
 #exc is the column to exclude ie has non numeric data
  #res1 has mean for all rows with no NAs
  }else{

    apply(m,1,func)
}
}

测试:

my_mean(testdata,mean,c("O1","O2","O3"),na.rm = F,1)


 #  $res1
  #      1         3         5 
  #   5.000000 16.000000  3.333333 

   # $res2
   #   2   4 
    # 7.5 4.5 

推荐阅读