我有一个相同数据框的列表。每个数据帧都包含具有唯一变量(temp / DO)和重复变量(eg-t1)的列。
[[1]]
temp DO t1
1 4 1
3 9 1
5 7 1
我想找到温度等于t1时DO的平均值。 t1代表特定温度,但是该值对于列表中的每个数据帧均不同,因此我无法指定实际值。
到目前为止,我已经尝试编写函数
hvod<-function(DO, temp, depth){
hDO<-DO[which(temp==t1[1])]
mHDO<-mean(hDO)
htemp<-temp[which(temp=t1[1])]
mhtemp<-mean(htemp)
}
hfit<-hvod(data$DO, data$temp, data$depth)
但是无论出于什么原因,都无法识别t1。关于功能的任何想法或 一种将select(dplyr函数)和lapply结合起来的方法来解决这个问题? 我见过类似的文章,但没有一篇适用于针对每个数据帧而变化的特定值(t1)的问题。
答案 0 :(得分:0)
我只是将数据框作为参数,并在函数内部进行其余逻辑处理,因为它为函数提供了更多控制权。这样的事情会起作用,
hvod<-function(data){
temp <- data$temp
t1 <- data$t1
DO <- data$DO
hDO<-DO[which(temp==t1[1])]
mHDO<-mean(hDO)
htemp<-temp[which(temp=t1[1])]
mhtemp<-mean(htemp)
}
答案 1 :(得分:0)
您可以尝试使用use(done)
函数将列表中的所有data.frame组合到一个data.frame中。
然后对data.frame号进行分组,以找到dplyr::bind_rows
为mean
的{{1}}中的DO
:
temp==t1
数据:
library(dplyr)
bind_rows(ll, .id = "DF_Name") %>%
group_by(DF_Name) %>%
filter(temp==t1) %>%
summarise(MeanDO = mean(DO)) %>%
as.data.frame()
# DF_Name MeanDO
# 1 1 4.0
# 2 2 6.5
# 3 3 6.7
答案 2 :(得分:0)
感谢Thiloshon和MKR的帮助!我最初将所需的数据合并到一个数据帧列表中,但要回答这个问题,实际上我的数据存放在单独的数据帧(fitsObs
和df1
)中。
我在代码中使用的变量是1到1,因此通过找到depth
和d2
相同的范围(我在代码中使用了temp
和t1
例如),我可以找到该范围内的平均值。
for(i in 1:1044){
df1 <- GLNPOsurveyCTD$data[[i]]
fitObs <- fitTp2(-df1$depth, df1$temp)
deptho <- -abs(df1$depth) #defining temp and depth in the loop
to <- df1$temp
do <- df1$DO
xx <- which(deptho <= fitObs$d2) #mean over range xx
mhtemp <- mean(to[xx], na.rm=TRUE)
mHDO <- mean(do[xx], na.rm=TRUE)
}