2017-04-25 4 views
0

私はIDのクライアント、月、金額で毎月の販売チケットを持つ1つのdata.frameを持っています。IDで条件づけされた複数の行と、他のデータフレームで与えられたその他の条件を選択します。

head(tickets) 
    id_client  month sales 
1 ID87160 2016-01-01 16875 
2 ID18694 2016-01-01 448 
3 ID20624 2016-01-01 16311 
4 ID171683 2016-01-01 314 
5 ID214926 2016-01-01 8889 
6 ID82071 2016-01-01 7479 

クライアントがサブスクリプションをキャンセルした瞬間があります。

head(stop_being_client) 
    id_client  date 
1 ID235005 2016-03-01 
2 ID50615 2016-04-01 
3 ID72078 2016-03-01 
4 ID129556 2016-01-01 
5 ID204060 2016-04-01 
6 ID57769 2016-01-01 

今、私はチケットの表に、すなわちstop_being_clientの日付より大きいチケットの月で、無加入のクライアントのいずれかのレジスタは存在しませんことを確認する必要があります。 PostgreSQLの

は簡単だろう:

SELECT 
    * 
FROM 
    tickets 
JOIN 
    stop_being_client 
ON 
    tickets.id_client = stop_being_client.id_client 
WHERE 
    tickets.month > stop_being_client.date; 

しかし、私はこの

tickets[which(
    tickets$id_client %in% stop_being_client$id_client & 
    tickets$month > stop_being_client$date 
    ),] 

と試みたR.でそれを行う方法を見当がつかないしかし、私は結果があることをかなり確信していますどういうわけか、日付を比較するときに両方のテーブルからid_clientを関連付ける必要があるためです。

EDIT:私は例を置く:

これはチケットdata.frameです:

id_client  month sales 
     ID2 2016-01-01 12698 
     ID1 2016-01-01 8626 
     ID2 2016-02-01 18309 
     ID1 2016-02-01 15653 
     ID3 2016-02-01 9642 
     ID3 2016-03-01 18376 
     ID1 2016-03-01 13440 
     ID2 2016-03-01 2322 
     ID1 2016-04-01 19010 
     ID3 2016-04-01 7129 
     ID2 2016-04-01 14694 
     ID2 2016-05-01 4726 
     ID1 2016-05-01 706 
     ID3 2016-05-01 16995 
     ID1 2016-06-01 18743 
     ID3 2016-06-01 16725 
     ID2 2016-07-01 2632 

これは、テーブルstop_being_clientです:

id_client  date 
     ID1 2016-03-01 
     ID2 2016-04-01 

だから私は検出したいですその場合には存在しないチケットの行:

01ここで
+0

あなたは([再現可能な例]を作ることができますhttp://stackoverflow.com/questions/5963269/how -to-make-a-great-r-reproducible-example)と出力はどのように見えるでしょうか? –

答えて

1

がベースR、data.table

l4 <- split(df, df$id_client) 
do.call(rbind, lapply(Map(cbind, l4, temp = ind1), function(i){ 
            i <- i[i$month > i$temp[!is.na(i$temp)],]; 
            i$temp <- NULL; i 
            })) 


#  id_client  month sales 
#ID1.9  ID1 2016-04-01 19010 
#ID1.13  ID1 2016-05-01 706 
#ID1.15  ID1 2016-06-01 18743 
#ID2.12  ID2 2016-05-01 4726 
#ID2.17  ID2 2016-07-01 2632 
+1

非等価結合を使うことができますね。 – akrun

+0

@akrunはい、また真です。それを考えなかった – Sotos

0

を通じてアイデアです:

library(data.table) 
setDT(tickets) 
setDT(stop_being_client) 

stop_being_client[tickets, on = .(date < month, id_client==id_client),nomatch=0,.(id_client,month,date,sales)] 

id_client  month  date sales 
1:  ID1 2016-04-01 2016-04-01 19010 
2:  ID2 2016-05-01 2016-05-01 4726 
3:  ID1 2016-05-01 2016-05-01 706 
4:  ID1 2016-06-01 2016-06-01 18743 
5:  ID2 2016-07-01 2016-07-01 2632 
関連する問題