Найти среднее значение одной переменной, подставленной другой переменной - PullRequest
0 голосов
/ 05 июля 2018

У меня есть список идентичных фреймов данных. Каждый фрейм данных содержит столбцы с уникальными переменными (temp / DO) и с повторяющимися переменными (например, -t1).

[[1]]
    temp DO t1 
    1    4  1
    3    9  1
    5    7  1

Я хочу найти среднее значение DO, когда температура равна t1. 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 голосов
/ 05 июля 2018

Вы можете попробовать использовать функцию dplyr::bind_rows, чтобы объединить все data.frames из списка в один data.frame.

Затем сгруппируйте по номеру data.frame, чтобы найти mean из 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

Данные:

df1 <- read.table(text = 
"temp DO t1 
1    4  1
3    9  1
5    7  1",
header = TRUE)


df2 <- read.table(text = 
"temp DO t1 
3    4  3
3    9  3
5    7  1",
header = TRUE)

df3 <- read.table(text = 
"temp DO t1 
2    4  2
2    9  2
2    7  2",
header = TRUE)

ll <- list(df1, df2, df3)
0 голосов
/ 06 июля 2018

Спасибо Тилошон и МКР за помощь! Сначала я объединил необходимые данные в один список фреймов данных, но чтобы ответить на это, мои данные были в отдельных фреймах данных (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)
}
0 голосов
/ 05 июля 2018

Я бы просто взял фрейм данных в качестве аргумента и выполнил бы остальную часть логики внутри функции, так как это дает больший контроль над функцией. Примерно так будет работать,

 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)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...