2017-05-11 8 views
1

カテゴリ変数に基づいて、データセット内の共通の日付を見つける:私はマークの目と共通の日付を見つけることができるようにする各idについて私はこのような何かに見えるデータセット持って

id eye date  notes 
1  L 01-01-2000 
1  L 01-06-2000 
1  R 01-01-2000 
1  R 01-03-2000 
1  R 01-06-2000 
2  L 01-01-2000 
2  L 01-04-2000 
2  R 01-04-2000 
2  R 01-07-2000 
2  R 04-09-2001 
3  L 01-01-2000 
4  L 01-01-2000 
4  L 03-03-2001 
4  R 03-03-2001 

をL、Rとして出力し、データフレームとして出力する。

id eye date  notes 
1  L 01-01-2000 
1  L 01-06-2000 
1  R 01-01-2000 
1  R 01-06-2000 
2  L 01-04-2000 
2  R 01-04-2000 
4  L 03-03-2001 
4  R 03-03-2001 

私はdplyrplyr(以下の例)でさまざまなバリエーションをしようとしてきたが、私はそれは私がやりたいように見えることはできません。だから、のようになります。

data %>% group_by(id) %>% do(Reduce(intersect, list(.$date[.$eye == "L"], .$date[.$eye == "R"]))) 

ddply(data, .(id), summarize, Reduce(intersect, list(.$date[.$eye == "L"], .$date[.$eye == "R"]))) 

意味的にこれらの両方は、私がそれらにしたいと言っているようですが、わかりやすい結果は得られません。

アイデア?

+0

私は例を更新しました。 LとRのエントリはペアになる必要はありません。もう1つは数多くあるかもしれません(または全くないかもしれません)。私は特定の日付のすべてのL/Rペアを、各IDごとに探しています。私はこれがはっきりしていることを望む –

答えて

1

別のものを使用することができます。

df <- read.table(header=TRUE, text="id eye date 
1  L 01-01-2000 
      1  L 01-06-2000 
      1  R 01-01-2000 
      1  R 01-03-2000 
      1  R 01-06-2000 
      2  L 01-01-2000 
      2  L 01-04-2000 
      2  R 01-04-2000 
      2  R 01-07-2000 
      2  R 04-09-2001 
      3  L 01-01-2000 
      4  L 01-01-2000 
      4  L 03-03-2001 
      4  R 03-03-2001") 

library(dplyr) 

left_join(df %>% 
      group_by(id,date) %>% 
      summarize(n=n()) %>% 
      filter(n==2) %>% 
      select(-n), 
      df, 
      by=c("id","date")) %>% 
    arrange(id,eye,date) 
3

あなたの例のデータの場合のように、ID-日には2つの観測が、あるときは常にLとRがある場合、あなたはこのようなduplicated使用することができます。

dat[duplicated(dat[-2]) | duplicated(dat[-2], fromLast = TRUE),] 
    id eye  date 
1 1 L 01-01-2000 
2 1 L 01-06-2000 
3 1 R 01-01-2000 
5 1 R 01-06-2000 
7 2 L 01-04-2000 
8 2 R 01-04-2000 
13 4 L 03-03-2001 
14 4 R 03-03-2001 

をあなたの場合LとRの両方が、ID-日付のペアで存在していることを確認する必要があり、あなたは上記の結果を保存し、使用することができますdplyrでこの

temp <- dat[duplicated(dat[-2]) | duplicated(dat[-2], fromLast = TRUE),] 
temp[as.logical(ave(as.character(temp$eye), temp$id, temp$date, 
        FUN=function(x) all(x %in% c("L", "R")))),] 
    id eye  date 
1 1 L 01-01-2000 
2 1 L 01-06-2000 
3 1 R 01-01-2000 
5 1 R 01-06-2000 
7 2 L 01-04-2000 
8 2 R 01-04-2000 
13 4 L 03-03-2001 
14 4 R 03-03-2001 
+0

ご返信ありがとうございます。彼らがペアになることは必ずしもそうではありませんが、Rと任意の(おそらく異なる)Lの異なる日付がいくつでもあります。私は自分の投稿を編集します。 –

2

のようなチェックを実行するaveを使用することができfilter

dat %>% 
    group_by(date) %>% 
    filter(sum(eye == "L") > 0 & sum(eye == "R") > 0 & !(duplicated(date) & duplicated(eye))) 

Source: local data frame [6 x 3] 
Groups: date [3] 

    id eye  date 
    <int> <fctr>  <fctr> 
1  1  L 01-01-2000 
2  1  L 01-06-2000 
3  1  R 01-01-2000 
4  1  R 01-06-2000 
5  2  L 01-04-2000 
6  2  R 01-04-2000 
3

またdata.table

library(data.table) 
setDT(df1)[, .SD[(uniqueN(eye)>1) & !duplicated(eye)], date] 
#   date id eye 
#1: 01-01-2000 1 L 
#2: 01-01-2000 1 R 
#3: 01-06-2000 1 L 
#4: 01-06-2000 1 R 
#5: 01-04-2000 2 L 
#6: 01-04-2000 2 R 
関連する問題