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