找出一个变量的平均值,该变量又被另一个变量

时间:2018-07-05 15:55:06

标签: r function select

我有一个相同数据框的列表。每个数据帧都包含具有唯一变量(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)的问题。

3 个答案:

答案 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_rowsmean的{​​{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的帮助!我最初将所需的数据合并到一个数据帧列表中,但要回答这个问题,实际上我的数据存放在单独的数据帧(fitsObsdf1)中。 我在代码中使用的变量是1到1,因此通过找到depthd2相同的范围(我在代码中使用了tempt1例如),我可以找到该范围内的平均值。

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)
}