Суммировать данные в одном наборе данных на основе временного интервала из другого набора данных - PullRequest
2 голосов
/ 20 апреля 2020

Я проверил несколько других подобных вопросов, но не могу найти код, который работает для моих данных. У меня есть 2 набора данных (df1 и df2), один с интервалом времени (df1) и один с данными об осадках (df2). Я хотел бы получить общее количество осадков за временной интервал в df1. Из-за всех других данных в df1 я не могу объединить 2 набора данных, df1 каждая строка соответствует отдельному наблюдению, и мне нужен общий дождь для этого периода времени наблюдений.

df1 имеет интервалы дат;


  [1] 1969-06-18 UTC--NA             1972-06-19 UTC--NA             1989-06-18 UTC--NA            
  [4] 1992-06-13 UTC--NA             1993-06-17 UTC--1993-10-02 UTC 1997-06-21 UTC--1997-09-19 UTC

и df2 имеет данные об осадках в день (данные с 1987 по 2018 годы); head(df2)

 Date       rain_mm 

1  1987-06-01        0.0      
2  1987-06-02        0.0    
3  1987-06-03        0.0     
4  1987-06-04        0.0     
5  1987-06-05        6.0       
6  1987-06-06        6.4

Как узнать сумму осадков в течение каждого интервала времени? Я создал начальную дату (df1 $ Date) и конечную дату (df1 $ end) из интервала, затем попытался выполнить следующее:

df1$rain <- NA #empty column for data

                df1$rain[i] <-sum(df2$rain_mm[which(
                                     df1$Date>= df2$Date[i] &
                                     df2$Date<= df1$end[i])])}

There were 50 or more warnings (use warnings() to see the first 50)

 df1$rain 
NULL

Warning message:
Unknown or uninitialised column: 'rain'.

Код был выполнен, но не кажется, на самом деле не работает. Самая большая проблема - получить сумму за определенный промежуток времени. Любая помощь очень ценится.

1 Ответ

1 голос
/ 23 апреля 2020

Наконец-то решил. Для всех, кто интересуется ответом ...

df1$rain <- NA #empty column for data

for(i in 1:nrow(df1)) {
      s <- df1$Date[i]
      e <- df1$end[i]
      if(is.na(s)) {df1$rain[i] <- NA}
      if(is.na(e)) {df1$rain[i] <- NA}
      else{
      df1$rain[i] <- sum(df2$rain_mm[which(
      df2$Date >= s & 
      df2$Date <= e)], na.rm = TRUE)}
} 

... Я также добавил, что вывод будет NA, если либо Date (s, либо e) равны NA.

...