2017-08-17 8 views
1

私は唯一の2つの以上の異なる日付を持っているし、「タイプ」を保つタイプによって、このデータフレームをサブセットする必要があり、このサブセットデータフレーム

df<-data.frame(datecol=as.Date(c("2010-04-03","2010-04-04","2010-04-05","2010-04-06","2010-04-07", 
            "2010-04-03","2010-04-04","2010-04-05","2010-04-06","2010-04-07", 
            "2010-05-06","2010-05-07","2010-05-09","2010-06-06","2010-06-07")),x=c(1,1,1,0,1,1,1,0,0,0,1,0,0,0,1),type=c(rep("A",5),rep("B",5),rep("C",5))) 

> df 
     datecol x type 
1 2010-04-03 1 A 
2 2010-04-04 1 A 
3 2010-04-05 1 A 
4 2010-04-06 0 A 
5 2010-04-07 1 A 
6 2010-04-03 1 B 
7 2010-04-04 1 B 
8 2010-04-05 0 B 
9 2010-04-06 0 B 
10 2010-04-07 0 B 
11 2010-05-06 1 C 
12 2010-05-07 0 C 
13 2010-05-09 0 C 
14 2010-06-06 0 C 
15 2010-06-07 1 C 

のように見えるデータを持っていますそれらの日付は少なくとも1日離れています。上記の例では、タイプAには4つの異なる日付があり、タイプCには2つの異なる日付が1日以上離れているため、この2つを新しいデータフレームとして保存します。タイプBには2つの異なる日付がありますが、1日間隔ではありませんので、保管したくありません。

ループカウントでは、各タイプ内にいくつのユニークな日付があるかを考えていましたが、2つ以上の異なる日付を持つものはすべて残しておきます。それから私は2つの異なる日付しか持っていないものを見て、それらの間の距離を計算し、距離が1より大きいものだけを残すでしょう。しかし、より効率的な方法があるようです。何か案は?

答えて

2

data.tableの一つの解決策:

#make sure datecol is Date 
df$datecol <- as.Date(df$datecol) 

library(data.table) 
#x needs to be 1 and the date difference more than a day per type 
#then in the second [] we select the TRUEs 
setDT(df)[x == 1, diff(datecol) > 1, by = type][V1 == TRUE, type] 
#[1] A C 
#Levels: A B C 
+0

素晴らしい、ありがとう! :) – Liza

+0

あなたは大歓迎です:) – LyzandeR

関連する問題