반응형
[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가 동일한 것을 확인할 수 있다.
반응형
'R' 카테고리의 다른 글
[R] Add an index (or counter) to a dataframe by group (1) | 2021.03.26 |
---|---|
[R] caret 패키지로 modeling & model tuning (iris classification :: knn algorithm) (0) | 2020.09.16 |
[R] caret 패키지로 scale 하는 방법 :: scale in R (preProcess in caret) :: 표준화 vs 정규화 (0) | 2020.09.03 |
윈도우 작업 스케줄러에 R script 등록하기 (2) | 2020.03.05 |
[R] Nelson Rules in R (5) | 2020.02.04 |