Вычислите среднее значение для диапазона значений между двумя датами, используя несколько наборов данных в R - PullRequest
1 голос
/ 18 апреля 2020

У меня есть два набора данных, один содержит значения температуры за 30 лет, а второй - время ожидания размножения животных. Я пытался вычислить среднюю температуру между двумя последующими событиями размножения [Даты] для каждого человека в каждом году размножения. Я также не хочу включать в последующее событие размножения температуру в течение дня, когда разводили животное.

Формат набора данных_1:

        Date Year      Temp
1 1981-09-01 1981      28.77444
2 1981-09-02 1981      28.84889
3 1981-09-03 1981      29.20944
4 1981-09-04 1981      30.37500
5 1981-09-05 1981      30.32222
6 1981-09-06 1981      30.10111

Формат набора данных_2:

      Year       Date   ID
10274 1983 1983-05-30   201
10275 1983 1983-06-12   201
10276 1983 1983-06-23   201
10277 1987 1987-06-13   201
10278 1987 1987-06-25   201
10279 1987 1987-07-05   201

Мне нужно, чтобы окончательный набор данных выглядел следующим образом:

      Year       Date   ID    Mean_Temp
10274 1983 1983-05-30   201       NA
10275 1983 1983-06-12   201       28
10276 1983 1983-06-23   201       29
10277 1987 1987-06-13   201       30  
10278 1987 1987-06-25   201       28
10279 1987 1987-07-05   201       29

Где средняя температура между двумя датами в наборе данных 2 рассчитывается с использованием данных о температуре из набора данных 1.

Здесь моя попытка до сих пор:

# Split values by ID
split_inter <- split(Dataset_2, list(Dataset_2$TAGID, Dataset_2$Year)) # Split data by year
split_inter <- split_inter[sapply(split_inter, function(x) dim(x)[1]) > 0] # Remove empty datasets

output.id <- list()
for(n in names(split_inter)){
  inter_framei <- split_inter[[n]]
  temps <- list()
  # Compute the mean temp between the dates
    for (k in seq_along(inter_framei$Date)){
      if (is.na(inter_framei$Date[k+1])==T) { 
        next; # next discontinues a particular iteration and jumps to the next cycle
      } else{
        temps <- Dataset_1[which(Dataset_1$Date > inter_framei$Date[k] & Dataset_1$Date <= inter_framei$Date[k+1]),]
        temps$TAGID <- droplevels(unique(inter_framei$TAGID))
        temps$k <- k
        mean.temps <- unique(data.frame(Date=last(temps$Date), 
                                        Year=last(temps$Year),
                                        mean.temp=mean(temps$Temp),
                                        ID=last(temps$TAGID),
                                        iteration=temps$k))
        print(mean.temps)
        output.id[[k]] <- mean.temps
      }
    }
}

Это печатает правильные значения, но не сохраняет их правильно в списке. Есть ли более простой способ сделать это? И ради любопытства, где я ошибаюсь с приведенным выше кодом?

...