Dplyr का फ़िल्टर (किसी भी पंक्तियों के साथ)
मैं आर दुनिया में नया हूँ, इन दिनों मुझे dplyr के फ़िल्टर फंक्शन के साथ समस्या है। मेरे पास एक df है और मुझे एक संख्या से अधिक मानों को फ़िल्टर करने की आवश्यकता है, लेकिन कुछ पंक्तियों में मेरे पास कई गुना मूल्य हैं (द्वारा अलग किया गया); )। उदाहरण के लिए मेरे पास यह डी.एफ.
ID value1 value2
1 1;0;3.4 4
2 3 5
3 0.5;2;1.3 0
4 5;0.1 3
मान 1 में एक या अधिक होने पर मेरा फ़िल्टर 3. से अधिक या बराबर है। मैं dplyr के फ़ंक्शन फ़िल्टर का उपयोग करता हूं क्योंकि मुझे df को दूसरों के फिल्टर का एहसास है। यह मेरा कोड है।
filt <- df %>% filter(any(as.numeric(unlist(strsplit(value1,';',fixed=TRUE))) >=3))
लेकिन इस मामले में कोई भी फ़ंक्शन df के सभी मूल्यों पर विचार करता है (पंक्ति द्वारा नहीं, जैसा कि मैंने सोचा था), इसलिए, मैं सभी df को मानता हूं और यह सही नहीं है।
मुझे इस उदाहरण के लिए आईडी 1,2 और 4 के साथ पंक्ति प्राप्त करने की आवश्यकता है।
मुझे लगता है कि मुझे पंक्ति द्वारा और अलग से जांच करनी चाहिए; , लेकिन मुझे नहीं पता कि यह कैसे dplyr के फिल्टर फ़ंक्शन के साथ किया जाता है।
बहुत बहुत धन्यवाद!
जवाब
एक विकल्प 'आईडी' separate_rows
से tidyr
समूहीकृत 'वैल्यू 1' को विभाजित करने के लिए होगा, 'वैल्यू 1' filter
में any
तत्व रखने वाले समूह जो 3 से अधिक या उसके बराबर हैं, फिर आईएनजी summarise
द्वारा कॉलम paste
और first
'वैल्यू 2' का तत्व प्राप्त करना ।
library(dplyr)
library(tidyr)
df %>%
separate_rows(value1, sep = ";", convert = TRUE) %>%
group_by(ID) %>%
filter(any(value1 >=3)) %>%
summarise(value1 = str_c(value1, collapse=";"), value2 = first(value2))
# A tibble: 3 x 3
# ID value1 value2
# <int> <chr> <int>
#1 1 1;0;3.4 4
#2 2 3 5
#3 4 5;0.1 3
या के map
साथ का उपयोग करstrsplit
library(purrr)
df %>%
filter(map_lgl(strsplit(value1, ";"), ~ any(as.numeric(.x) >=3)))
# ID value1 value2
#1 1 1;0;3.4 4
#2 2 3 5
#3 4 5;0.1 3
डेटा
df <- structure(list(ID = 1:4, value1 = c("1;0;3.4", "3", "0.5;2;1.3",
"5;0.1"), value2 = c(4L, 5L, 0L, 3L)), class = "data.frame", row.names = c(NA,
-4L))