निम्न डेटा फ्रेम पर विचार के आधार पर:फ़िल्टर एक data.frame के प्रत्येक स्तंभ एक विशिष्ट मूल्य
df <- data.frame(replicate(5,sample(1:10,10,rep=TRUE)))
# X1 X2 X3 X4 X5
#1 7 9 8 4 10
#2 2 4 9 4 9
#3 2 7 8 8 6
#4 8 9 6 6 4
#5 5 2 1 4 6
#6 8 2 2 1 7
#7 3 8 6 1 6
#8 3 8 5 9 8
#9 6 2 3 10 7
#10 2 7 4 2 9
dplyr
का उपयोग करते हुए, मैं कैसे प्रत्येक स्तंभ पर फ़िल्टर कर सकते हैं, (परोक्ष उनका नाम इस के बिना), सभी मानों के लिए एक से अधिक 2.
कोई चीज जो एक काल्पनिक filter_each(funs(. >= 2))
अभी नकल होगा मैं कर रहा हूँ:
df %>% filter(X1 >= 2, X2 >= 2, X3 >= 2, X4 >= 2, X5 >= 2)
कौन सा के बराबर है:
df %>% filter(!rowSums(. < 2))
नोट: मुझे क्या करना होगा चलो कहते हैं कि मैं पहले 4 स्तंभ पर केवल फिल्टर करने के लिए करना चाहता था दो,:
df %>% filter(X1 >= 2, X2 >= 2, X3 >= 2, X4 >= 2)
या
df %>% filter(!rowSums(.[-5] < 2))
चाहेंगे एक और अधिक कुशल विकल्प हो सकता है?
संपादित करें: उप सवाल
कैसे एक स्तंभ नाम निर्दिष्ट और एक hypothethical filter_each(funs(. >= 2), -X5)
नकल करने के लिए?
बेंचमार्क उप सवाल
जब से मैं एक बड़े डेटासेट पर इस चलाने के लिए है, मैं सुझाव बेंचमार्क।
df <- data.frame(replicate(5,sample(1:10,10e6,rep=TRUE)))
mbm <- microbenchmark(
Marat = df %>% filter(!rowSums(.[,!colnames(.) %in% "X5", drop = FALSE] < 2)),
Richard = filter_(df, .dots = lapply(names(df)[names(df) != "X5"], function(x, y) { call(">=", as.name(x), y) }, 2)),
Docendo = df %>% slice(which(!rowSums(select(., -matches("X5")) < 2L))),
times = 50
)
यहाँ परिणाम हैं:
#Unit: milliseconds
# expr min lq mean median uq max neval
# Marat 1209.1235 1320.3233 1358.7994 1362.0590 1390.342 1448.458 50
# Richard 1151.7691 1196.3060 1222.9900 1216.3936 1256.191 1266.669 50
# Docendo 874.0247 933.1399 983.5435 985.3697 1026.901 1053.407 50
क्या इसे dplyr का उपयोग करना है? – shecode
स्टीवन, मुझे लगता है कि आपने इसे 'डीएफ%>% फ़िल्टर (! पंक्तिसमूह (। <2))' –
@MaratTalipov अनुमान लगाया है, हां। लेकिन यह केवल कॉलम * नाम * निर्दिष्ट करने में सक्षम होना सुविधाजनक होगा जिसे आप फ़िल्टर नहीं करना चाहते हैं। एक hypothetical 'filter_each (मज़ेदार (।> = 2), -X5) की तरह कुछ ' –