2016-06-16 16 views
0
ID  Date1  Date2  Date3 
1111 4/6/2016 NA   5/1/2016 
1111 4/6/2016 3/31/2016 NA 
1111 4/6/2016 4/2/2016 3/29/2016 
1112 4/17/2016 4/29/2016 6/2/2016 
1112 4/17/2016 5/1/2016 5/16/2016 
1112 4/17/2016 NA   2/1/2016 
1113 4/6/2016 3/4/2016 5/12/2016 
1113 4/6/2016 4/4/2016 2/16/2016 
1114 5/2/2016 4/20/2016 5/29/2016 
1114 5/2/2016 4/30/2016 5/21/2016 
1115 3/31/2016 2/3/2016 2/2/2016 
1115 3/31/2016 2/5/2016 2/4/2016 

上記のデータセットでは、Date3のMAX(最新)値とDate(ID2)のMIN(最も古い)値を選択します。R:特定の条件に基づいて行を選択します。

Date2の少なくとも1つの値は、Date1よりも少なく(古い)、Date3の1つの値はDate1 PER IDよりも新しい(新しい)ものです。

私は次のように返されるのでしょう:

1111 4/6/2016 3/31/2016 5/1/2016 
1113 4/6/2016 3/4/2016 5/12/2016 
1114 5/2/2016 4/20/2016 5/29/2016 

(日付2でどちらの値が日付1未満であるため、1112が返されないだろう、とDate3でどちらの値がより大きいので、1115が返されることはありません日付1)。

私はこれをかなりの時間(私は初心者のコーダーです)作業していますので、どんな助けでも大歓迎です!

答えて

0

あなたはこれを試してみてくださいdplyrライブラリを使用する場合:あなたの所望のデータフレームを与える必要があります

library(dplyr) 
filtered_data <- data %>% filter(Date2 < Date1 & Date3 > Date1) %>% 
group_by(ID, Date1) %>% 
summarize(minD2 = min(Date2, na.rm = T), maxD3 = max(D3, na.rm = T) 

+0

おかげまず、あなたの条件に一致するIDのセットを取得します。私が探している最初のデータフレームは、大雑把な目で見ればわかりません(私はずっと効率の低いコードを使って同様の結果を得ています)。しかし、私が本当に苦労していることである上に挙げた条件(「与えられた」の下に列挙されている)に合致する必要があります。それについてのアドバイスは? – chr

+0

これは、Date2 date1のようなレコードしかないことを確認するfilter(Date2 Date1)を持っている理由です。 – Zakkery

+0

申し訳ありませんが、私は初めてその部分を逃しました。これは機能し、私が自分で作業していたものよりはるかに簡単です。ありがとう! – chr

1

私はこれを2つのステップで行います。その後

library(magrittr) 
library(dplyr) 
selected_ids <- data %>% 
    group_by(ID) %>% 
    summarize(PassD1vD2=any(na.omit(Date2 < Date1)), 
       PassD1vD3=any(na.omit(Date3 > Date1))) %>% 
    filter(PassD1vD2 & PassD1vD3) %$% ID %>% unique 

&最大最小のグループを選択します:応答のための

filtered_data <- data %>% 
    filter(ID %in% selected_ids) %>% 
    group_by(ID) %>% 
    summarize(Date1=Date1[1], minD2=min(Date2, na.rm=TRUE), maxD3=max(Date3, na.rm=TRUE)) 
+0

Ryan、あなたは以下のコードに関する問題について絶対に正解でした。あなたのコードは、私が探していた実際の情報を提供します。問題に気付き、提供されたコードに感謝していただきありがとうございます。 – chr

関連する問題