2017-05-11 3 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의 항목은 쌍으로 올 필요가 없습니다. 다른 하나는 많고 많지 않을 수도 있습니다. 나는 각 id에 대해 특정 날짜에 모든 패/R 쌍을 찾고 있습니다. 나는 이것이 분명하기를 바란다! –

답변

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 
관련 문제