2017-11-30 6 views
1

아마도 간단한 해결책 일 수는 있지만 우아한 방법을 찾을 수 없습니다. df 다음에서 나는 벡터에 따라 값을 찾아 경기뿐만 아니라 경기가있는 전체 그룹뿐만 아니라 반환 할.데이터 프레임을 벡터로 필터링하고 일치 그룹 반환

df <- data.frame(group= c("a","a","b","b","b","c","d","d"), 
        person = c("Tom","Jerry","Tom","Anna","Sam","Nic","Anna","Jerry"), stringsAsFactors = FALSE) 

search_vector <- c("Tom","Nic") 

예상 출력

df_result 
    group person 
1  a Tom 
2  a Jerry 
3  b Tom 
4  b Anna 
5  b Sam 
6  c Nic 

하나는 물론 그것을 할 수 그러나이 단계에서 더 나은 방법을이 있어야한다

df_sub <- subset(df, person %in% search_vector) 
df_result <- subset(df, group %in% df_subset$group) 

편집 한

library(microbenchmark) 
microbenchmark(

    dplyr_test= df %>% 
    group_by(group) %>% 
    filter(any(person %in% search_vector)), 
    base= df[ave(df$person %in% search_vector, df$group, FUN=any),], 
    convoluted = df[df$group %in% df$group[df$person %in% search_vector],], 
    times = 100 

) 


Unit: microseconds 
     expr  min  lq  mean median  uq  max neval 
dplyr_test 3191.893 3433.7885 3736.42618 3649.4145 3991.2770 5017.041 100 
     base 131.175 150.0395 193.04807 184.2435 224.6185 367.780 100 
convoluted 43.726 52.0120 68.80326 61.0035 86.0395 123.770 100 
+0

모든 답변이 문제를 해결할 때 정확하게 정확한 예의는 무엇인지 모릅니다. 우아함은 개인의 취향에 달려 있지만, 벤치 마크는 @Abdou의 대답에 따른 효율성 이점을 나타냅니다. 그러므로 나는 그의 대답을 받아 들인다. – user6617454

답변

2

이다 또는 색인의 다소 복잡한 (하지만 효율적인) 세트를 사용 any '사람'에 대한 다음 filter '그룹'변수에 의해 그룹 :

df[df$group %in% df$group[df$person %in% search_vector],] 
2

우리 %in% 'search_vector'

library(dplyr) 
df %>% 
    group_by(group) %>% 
    filter(any(person %in% search_vector)) 
2

기본 R에서는 aveany과 함께 사용하고 결과를 논리 인덱싱에 사용할 수 있습니다.

df[ave(df$person %in% search_vector, df$group, FUN=any),] 
    group person 
1  a Tom 
2  a Jerry 
3  b Tom 
4  b Anna 
5  b Sam 
6  c Nic