Dplyr का फ़िल्टर (किसी भी पंक्तियों के साथ)

Aug 18 2020

मैं आर दुनिया में नया हूँ, इन दिनों मुझे 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 के फिल्टर फ़ंक्शन के साथ किया जाता है।

बहुत बहुत धन्यवाद!

जवाब

1 akrun Aug 18 2020 at 02:00

एक विकल्प 'आईडी' 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))