2016-06-27 3 views
-1

R의 초보자 사용자로부터 질문 행을 병합하는 방법 : 아래 그림과 같이 내가 연속 enabled_datetimedisabled_datetime와 데이터를 가지고 : 나는로 변환하고 싶습니다 무엇연속 날짜

x<-as.data.frame(cbind(
     supplier_id=281743, 
     enabled_datetime=c('2016-06-13 13:31:02','2016-06-14 07:39:19','2016-06-14 12:36:03','2016-06-16 13:44:30','2016-06-17 06:42:14'), 
     disabled_datetime = c('2016-06-14 07:39:19','2016-06-14 12:36:03','2016-06-16 13:44:30','2016-06-17 06:42:14', NA), 
     discount=c(25,15,15,10,30)) 
) 
x 

supplier_id enabled_datetime disabled_datetime discount 
     281743 2016-06-13 13:31:02 2016-06-14 07:39:19  25 
     281743 2016-06-14 07:39:19 2016-06-14 12:36:03  15 
     281743 2016-06-14 12:36:03 2016-06-16 13:44:30  15 
     281743 2016-06-16 13:44:30 2016-06-17 06:42:14  10 
     281743 2016-06-17 06:42:14    <NA>  30 

이 같다 : 즉

supplier_id enabled_datetime disabled_datetime discount 
     281743 2016-06-13 13:31:02 2016-06-14 07:39:19  25 
     281743 2016-06-14 07:39:19 2016-06-16 13:44:30  15 
     281743 2016-06-16 13:44:30 2016-06-17 06:42:14  10 
     281743 2016-06-17 06:42:14    <NA>  30 

같은 supplier_id, discount으로 행을 병합하고 enabled_datetimedisabled_datetime 연속 있습니다. 내가 생각할 수있는 것은 for 루프를 사용하는 것인데, 어떤 방법으로 그렇게 다른 방법을 알 수 있습니까? 미리 감사드립니다.

+3

[좋은 질문을하는 방법] (http://stackoverflow.com/help/how-to-ask) 및 [재현 가능한 예] (http://stackoverflow.com)를 제공하는 방법에 대한 정보를 읽어보십시오./questions/5963269). 이렇게하면 다른 사람들이 당신을 도울 수있게됩니다. – zx8754

+0

'lead()','lag()'및 [merge] (http://stackoverflow.com/questions/1299871)에 대해 읽어보십시오. – zx8754

+0

왜 병합 하시겠습니까? 그룹을 supplier_id 및 할인으로 정렬하고 날짜를 정렬하면 dplyr을 사용하여이 작업을 수행 할 수 있습니다. 내가 틀렸다면 수정하십시오. 추신 : pls 왜이 같은 downvoting? –

답변

2
df <- data.frame(supplier_id = c(281743,281743,281743,281743,281743), 
       enabled_datetime = c("2016-06-13 13:31:02","2016-06-14 07:39:19","2016-06-14 12:36:03","2016-06-16 13:44:30","2016-06-17 06:42:14"), 
       disabled_datetime = c("2016-06-14 07:39:19","2016-06-14 12:36:03","2016-06-16 13:44:30","2016-06-17 06:42:14",NA), 
       discount = c(25,15,15,10,30)) 

df <- df%>% 
    mutate(enabled_datetime = as.POSIXct(strftime(enabled_datetime,format="%Y-%m-%d %H:%M:%S")), 
     disabled_datetime = as.POSIXct(strftime(disabled_datetime,format="%Y-%m-%d %H:%M:%S"))) 

subdf1 <- df%>% 
    group_by(supplier_id,discount) %>% 
    mutate(enabled_datetime_lead = lead(enabled_datetime),disabled_datetime_lead = lead(disabled_datetime)) %>% 
    filter(disabled_datetime==enabled_datetime_lead) %>% mutate(disabled_datetime = disabled_datetime_lead) %>% 
    select(-enabled_datetime_lead,-disabled_datetime_lead) %>% ungroup() 

subdf2<- anti_join(df,resdf,by=c("supplier_id","discount")) 

resdf <- full_join(subdf1,subdf2,,by=c("supplier_id","discount")) 

이의 결과는 변경

supplier_id enabled_datetime disabled_datetime discount 
     <dbl>    <time>    <time> <dbl> 
1  281743 2016-06-14 07:39:19 2016-06-16 13:44:30  15 
2  281743 2016-06-13 13:31:02 2016-06-14 07:39:19  25 
3  281743 2016-06-16 13:44:30 2016-06-17 06:42:14  10 
4  281743 2016-06-17 06:42:14    <NA>  30 

설명입니다 최종 결과는 두 개의 새 열을 가지고로 unionfull_join에서 마지막 문을 변경했습니다. 그 행동은 원래 발견 된 것과는 다릅니다.

+0

와우, 많이. – macchiavalley

+0

@macchiavalley 왜 답변이 표시되지 않았습니까? – theArun

+0

이 솔루션은 오류를 promtpts 및 인용 된대로 결과를 생성하지 않습니다. 'subdf2 <- anti_join (df, resdf, by = c ("supplier_id", "discount"))'이면 안됩니까? – macchiavalley

관련 문제