r - 在用户定义的函数中包含公式
问题描述
假设我想计算每行或每组的特定值(在这个示例问题中,这个值是平均值)我该怎么做?
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
那么我在这里做错了什么,它不起作用?
提前致谢!
解决方案
这是一个替代方案,尽管不是最好的。您可以根据需要进行重构:
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
推荐阅读
- sql - Oracle SQL/PLSQL:一次性更改特定列的类型
- python - 向 QScrollArea 添加元素时滚动到底部
- java - 如何在 JAVA 中使用 com.google.zxing libraby 在二维码下方添加文本
- python - ModuleNotFoundError:没有名为“tensorflow_hub”的模块
- java - 如何打破递归函数的多个实例调用?
- mongodb - Mongoose 文本索引搜索返回空数组
- python - 如何在 sqlalchemy 中编写不同的查询?
- javascript - 按下制表符时如何操作光标跳转的位置?
- php - 关于方法的 PHP 文档
- ubuntu - 安装logstash后无法在“/etc/”下找到目录logstash