R

[R] How to expand rows by date range using start and end date?

슈퍼짱짱 2021. 3. 26. 16:22
반응형

[R] Data Frame or Data Table 에서 start, end 타임 기준으로 데이터 펼치는 방법

다음과 같이 start, end time 이 있는 데이터가 있다고 하자.

단, 시간은 POSIXct 형태이다.

 

start <- as.POSIXct(c('2020-01-11 14:27:00','2020-01-11 15:30:00','2020-01-11 16:31:00','2020-01-11 17:29:00','2020-01-11 18:29:00','2020-01-11 19:32:00','2020-01-11 20:31:00','2020-01-11 21:33:00','2020-01-11 22:29:00','2020-01-11 23:37:00'),
                    format = '%Y-%m-%d %H:%M:%S', tz = 'Asia/seoul')
end <- as.POSIXct(c('2020-01-11 14:30:00','2020-01-11 16:00:00','2020-01-11 18:55:00','2020-01-11 19:56:00','2020-01-11 20:56:00','2020-01-11 21:59:00','2020-01-11 22:57:00','2020-01-12 00:01:00','2020-01-12 00:56:00','2020-01-12 02:03:00'),
                  format = '%Y-%m-%d %H:%M:%S', tz = 'Asia/seoul')

data <- data.frame(A = 1:10,
                   B = letters[1:10],
                   start = start,
                   end = end)

 

이를 TIME 이라는 새로운 열을 만들어 다음과 같이 분 단위로 변환하려 한다.

 

기존 data 에서 start ~ end time 에 대해 분 단위로 data 가 expand 되었다. 

시간 뿐 아니라 A, B 컬럼도 함께 expand 된 것을 확인할 수 있다.

 

이를 수행하는 방법은 다음과 같다.

 

library(data.table)
library(tidyverse)

result <- setDT(data)[ , list(A = A,
                              B = B, 
                              TIME = seq(start, end, by = '1 min')), 
                       by = 1:nrow(data)] %>% as.data.frame()

 

1. data.table 라이브러리에 있는 setDT()로 data를 data.table 형태로 바꿔준다.

2. 기존 데이터에서 살리고 싶은 컬럼만 정의한다. 불필요시 제외해도 된다. (A 컬럼만 or B 컬럼만 살릴 수도 있다.)

3. seq() 함수를 이용해서 원하는 단위의 시간 컬럼을 생성한다. (컬럼명은 꼭 TIME이 아니어도 되며, 사용자가 정의할 수 있다.)

* by에 "1 min" 이 아닌 "hour", "day" 등 원하는 단위를 넣을 수 있다.

4. 원한다면 as.data.frame()을 통해 다시 data.frame 형태로 바꿔줄 수 있다. 

 


nrow 라는 컬럼이 자동으로 생성되면서 기존에 1행이었던 부분에는 1이, 2행이었던 부분에는 2가 채워진다.

 

nrow 로 group by 하여 시간의 분포를 확인하면 다음과 같다. 

 

result %>% 
  group_by(nrow) %>% 
  summarise(minT = min(TIME),
            maxT = max(TIME))

 

즉, 기존 data의 start 컬럼과 minT, end 컬럼과 maxT가 동일한 것을 확인할 수 있다.

 

 

반응형