R은

2017-05-10 3 views
1

여기 내 dataframe입니다 시간 차이에 따라 그룹화 : 나는 열을 추가 할R은

df <- data.frame(col_1 = c('11/13/2007', '11/17/2007', '11/19/2007', '11/25/2007', '11/28/2007'), 
       col_2 = c('A', 'B', 'C', 'D', 'E')) 

,하는 것 col_1에서 날짜의 시간 차이를 이용하여 그룹 요소. 예를 들어 첫 번째, 두 번째 및 세 번째 행은 날짜가 서로 다른 5 일 (연속 된 날짜 사이) 만 차이가 나고 행 4와 5가 그룹 2에 속하기 때문에 그룹 1에 포함됩니다. 두 개의 연속 된 날짜 ' 11/19/2007 '과 '11/25/2007'은 5 일 이상 차이가납니다.

날짜 사이의 일별 차이를 계산할 수 있지만 그룹화를 만드는 방법을 알려줍니다. 내가 dplyr와 솔루션을 선호 하겠지만 조언의 모든 조각은 주셔서 감사합니다.

답변

2

나는 당신이 특별한 것을 할 필요없이 그룹을 만들 수 있다고 생각합니다.

먼저 col_1을 청소 한 다음 그룹을 만드십시오. 참고 가독성을 높이기 위해 lag_time_diff을 만들지 만 원하는 경우 cumsum에 직접 넣을 수도 있습니다. 그것은 (1)에 의한 인덱스이고, 그렇지 않으면 동일한 값을 유지하는 경우의 시간 지연된 차이> 5 인 경우이 모든 수행

df$col_1 <- as.POSIXct(df$col_1, format = "%m/%d/%Y") 

lag_time_diff <- difftime(df$col_1, lag(df$col_1, default = df$col_1[1]), units = "days") 
df$group <- cumsum(ifelse(lag_time_diff>5,1,0)) 


df 
#  col_1 col_2 group 
#1 2007-11-13  A  0 
#2 2007-11-17  B  0 
#3 2007-11-19  C  0 
#4 2007-11-25  D  1 
#5 2007-11-28  E  1 

체크한다.

1

이 방법은 일부 중복 정보와 최종 제품을 만들고, 그래서 그것에 대해 갈 수있는 더 효율적인 방법은 확실히있다, 그러나 이것은 당신의 딜레마 만족하는 것 같다

## generate data 
df <- data.frame(col_1 = c('11/13/2007', 
          '11/17/2007', 
          '11/19/2007', 
          '11/25/2007', 
          '11/28/2007'), 
       col_2 = c('A', 'B', 'C', 'D', 'E')) 

## convert date to date class 
df$col_1 <- as.Date(as.character(df$col_1), format = "%m/%d/%Y") 

## define function for difftime variable 
foo <- function(d1, d) sapply(d, function(x) difftime(d1, x)) 

## apply function to each observation and convert to data frame 
dfdat <- structure(
    data.frame(sapply(df$col_1, foo, df$col_1)), 
    names = as.character(df$col_1)) 

## combine with original data 
df <- cbind(df, dfdat) 

## use tidyr package to make long form 
df <- tidyr::gather(df, referent, difftime, -col_1, -col_2) 

## load dplyr 
library(dplyr) 

## use dplyr to mutate and group 
df %>% 
    dplyr::mutate(referent = as.Date(referent)) %>% 
    dplyr::group_by(difftime) 

출처 : 로컬 데이터 프레임을 [25 × 4] 그룹 : 당신은 기본 R.으로 정말 빠르게 수행 할 수 있습니다 [19]

 col_1 col_2 referent difftime 
     <date> <fctr>  <date> <dbl> 
1 2007-11-13  A 2007-11-13  0 
2 2007-11-17  B 2007-11-13  -4 
3 2007-11-19  C 2007-11-13  -6 
4 2007-11-25  D 2007-11-13  -12 
5 2007-11-28  E 2007-11-13  -15 
6 2007-11-13  A 2007-11-17  4 
7 2007-11-17  B 2007-11-17  0 
8 2007-11-19  C 2007-11-17  -2 
9 2007-11-25  D 2007-11-17  -8 
10 2007-11-28  E 2007-11-17  -11 
# ... with 15 more rows 
1

difftime

df <- data.frame(col_1 = c('11/13/2007', '11/17/2007', '11/19/2007', '11/25/2007', '11/28/2007'), 
       col_2 = c('A', 'B', 'C', 'D', 'E')) 

df$col_1 = as.Date(df$col_1, format = "%m/%d/%Y") 

df$group = rleid(cumsum(c(0, diff.Date(df$col_1) > 5))) 

> df 
     col_1 col_2 group 
1 2007-11-13  A  1 
2 2007-11-17  B  1 
3 2007-11-19  C  1 
4 2007-11-25  D  2 
5 2007-11-28  E  2