2016-06-27 7 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とdiscountでグループ化し、日付を整理すると、dplyrでこれを行うことができます...私が間違っていれば私を修正しますか? PS:なぜこのようなdownvoting pls? –

答えて

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 

説明です:最終的な結果は、2つの新しい列を得たとしてunionfull_joinから最後の文を変更しました。その行動はもともと見つかったものとは異なっています。

+0

よろしくお願いします。 – macchiavalley

+0

@macchiavalley答えはなぜマークされていませんでしたか? – theArun

+0

解決策はエラーを予告し、引用したとおりに結果を生成しません。それは 'subdf2 < - anti_join(df、resdf、by = c(" supplier_id "、" discount "))'ではないでしょうか? – macchiavalley

関連する問題