2016-08-12 2 views
0

"시간"과 "온도"의 두 변수가있는 데이터 프레임이 있습니다. "time"변수의 형식은 "% Y- % m- % d % H : % M : % S"입니다. 나는 매일 밤낮으로 평균 기온을 계산하고 싶다. 낮과 밤은 일출과 일몰 시간으로 정의해야하며 두 번째 데이터 프레임에 저장됩니다. 즉, 매일 밤마다 시작 및 종료 시간이 다릅니다.계산 행은 다른 데이터 프레임에 정의 된 간격을 의미합니까?

그럼 내 질문은 : 일출과 일몰 시간으로 정의되는 매일 밤, 낮, 밤의 평균 기온은 어떻게 계산할 수 있습니까?

온도를 포함하는 첫 번째 데이터 프레임은 다음과 같습니다

time_temp_data <- data.frame(
    time = seq(
    as.POSIXct("2013-05-24 15:01:01"), 
    as.POSIXct("2013-06-02 03:31:01"), 
    by = "3 min" 
    ), 
    temp = seq(7.153, 36.809, length.out = length(time)) 
) 

그리고 일출과 일몰 시간을 포함하는 두 번째 데이터 프레임은 그 다음과 같습니다

sunrise_sunset <- data.frame(
    event = rep(c("sunrise", "sunset"), 21), 
    time = as.POSIXct(c("2013-05-18 03:59:01", "2013-05-18 22:07:01", "2013-05- 19 03:57:01", "2013-05-19 22:09:01", "2013-05-20 03:55:01", 
          "2013-05-20 22:11:01", "2013-05-21 03:53:01", "2013-05-21 22:13:01", "2013-05-22 03:51:01", "2013-05-22 22:15:01", 
          "2013-05-23 03:49:01", "2013-05-23 22:18:01", "2013-05-24 03:47:01", "2013-05-24 22:20:01", "2013-05-25 03:45:01", 
          "2013-05-25 22:22:01", "2013-05-26 03:44:01", "2013-05-26 22:24:01", "2013-05-27 03:42:01", "2013-05-27 22:26:01", 
          "2013-05-28 03:40:01", "2013-05-28 22:27:01", "2013-05-29 03:38:01", "2013-05-29 22:29:01", "2013-05-30 03:37:01", 
          "2013-05-30 22:31:01", "2013-05-31 03:35:01", "2013-05-31 22:33:01", "2013-06-01 03:34:01", "2013-06-01 22:35:01", 
          "2013-06-02 03:32:01", "2013-06-02 22:36:01", "2013-06-03 03:31:01", "2013-06-03 22:38:01", "2013-06-04 03:30:01", 
          "2013-06-04 22:40:01", "2013-06-05 03:29:01", "2013-06-05 22:41:01", "2013-06-06 03:28:01", "2013-06-06 22:42:01", 
          "2013-06-07 03:28:01", "2013-06-07 22:44:01")) 

) 

한 가지 방법은하는 것 두 데이터 프레임을 병합하십시오. 그러나 내 두 데이터 프레임 ("시간")의 공통 변수에는 정확히 동일한 데이터가 없습니다. 그런 다음 논리 연산자 (≥, ≤)를 사용하여 데이터 프레임을 병합하는 것이 이상적이지만 그렇게 할 수는 없습니다.

수정
질문이 수정되어 더 이상 광범위하지 않은 것으로 간주됩니다. 이 예는 상자 밖에서 실행할 수 있습니다.

+1

[여기] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example)을 참조하십시오. –

+0

@Steve_Corrin 제 질문을 편집하고 데이터의 예를 제공 했으므로 이제 어떻게 다시 열 수 있습니까? –

답변

1

이 솔루션은 데이터 프레임 조작을 위해 dplyr 패키지를 사용하고 날짜 - 시간 조작을 위해서는 lubridate을 사용하고 파이핑 명령은 magrittr을 함께 사용합니다.

time_temp_data <- data.frame(
    time = seq(
    as.POSIXct("2016-08-11"), 
    as.POSIXct("2016-08-12 23:00:00"), 
    by = "1 hour", 
), 
    temp = rnorm(48) 
) 
sunrise_sunset_data <- data.frame(
    sunrise = as.POSIXct(c("2016-08-11 05:59:30", "2016-08-12 06:00:30")), 
    sunset = as.POSIXct(c("2016-08-11 21:00:30", "2016-08-12 20:59:30")) 
) 

먼저 우리가 날짜와 시간에 날짜와 시간을 분할하는 데이터 세트에 ("돌연변이") 열을 추가 :

library(dplyr) 
library(lubridate) 
library(magrittr) 

여기 예를 들어 데이터 세트입니다.

time_temp_data %<>% 
    mutate_(
    date = ~ floor_date(time, "day"), 
    time_of_day = ~ difftime(time, date, "hours") 
) 

sunrise_sunset_data %<>% 
    mutate_(
    date = ~ floor_date(sunrise, "day"), 
    time_of_sunrise = ~ difftime(sunrise, date, "hours"), 
    time_of_sunset = ~ difftime(sunset, date, "hours") 
) 

그런 다음 우리는 일출/일몰 데이터의 시간/온도 데이터를 조인 하루의 시간이 일몰, 일출 전에 때

all_data <- inner_join(time_temp_data, sunrise_sunset_data, by = "date") 

야간입니다.

all_data %<>% 
    mutate_(
    is_night = ~ time_of_day > time_of_sunset | time_of_day < time_of_sunrise 
) 

이제 각 날짜와 주/야간 시간의 평균 기온은 이러한 변수를 그룹화하고 요약 통계를 계산하여 계산할 수 있습니다.

all_data %>% 
    group_by_(~ date, ~ is_night) %>% 
    summarize_(mean_temp = ~ mean(temp)) 
관련 문제