शायद एक आसान समाधान लेकिन एक सुंदर तरीका नहीं मिला। निम्नलिखित में 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)

1 संपादित करें

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
1
CER 30 नवम्बर 2017, 21:53

3 जवाब

सबसे बढ़िया उत्तर

या अनुक्रमण के कुछ जटिल (लेकिन कुशल) सेट का उपयोग करें:

df[df$group %in% df$group[df$person %in% search_vector],]
2
Abdou 30 नवम्बर 2017, 22:10

हम 'समूह' चर द्वारा समूहित करते हैं फिर filter any 'व्यक्ति' के लिए जो %in% 'search_vector' हैं

library(dplyr)
df %>% 
   group_by(group) %>%
   filter(any(person %in% search_vector))
2
akrun 30 नवम्बर 2017, 21:55

आधार R में, आप ave के साथ any का उपयोग कर सकते हैं और फिर परिणाम के लिए तार्किक अनुक्रमण का उपयोग कर सकते हैं।

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
2
lmo 30 नवम्बर 2017, 22:01