/ / Dplyr - r, dplyr का उपयोग करके एक कॉलम के आधार पर सभी कॉलमों को फ़िल्टर करना

Dplyr - r, dplyr का उपयोग कर एक कॉलम के आधार पर सभी कॉलम फ़िल्टर करना

मैं उन पंक्तियों को फ़िल्टर करना चाहूँगा जहाँ कम से कम एक स्तंभ, D को छोड़कर P से बड़ा है, dplyr का उपयोग करके। सभी स्तंभों पर फ़िल्टर करने वाले समाधान का पता लगाने की कोशिश करना।

उदाहरण

library(dplyr)

df <-  tibble(P = c(2,4,5,6,1.4), B =
c(2.1,3,5.5,1.2, 2),
C = c(2.2, 3.8, 5.7, 5,
1.5))

वांछित उत्पादन

df <- filter(df, B > P | C > P)
df

लागू करने के लिए एक समाधान, जो संभव हो तो मैं बचना चाहूंगा:

filter(df, apply(df, 1, function(x) sum(x > x[1]) > 1))

उत्तर:

जवाब के लिए 2 № 1

के बग़ैर dplyr...

df2 <- df[df$P!=apply(df,1,max),]

या के साथ dplyr...

df3 <- df %>% filter(P!=apply(df,1,max))

जवाब के लिए 2 № 2

यहां उपयोग करने का एक विकल्प है tidyverse जहाँ हम उपयोग करते हैं map तथा reduce से कार्य करता है purrr एक तार्किक पाने के लिए vector सेवा मेरे extract (से magrittr) मूल डेटासेट की पंक्तियाँ

library(tidyverse)
library(magrittr)
df %>%
select(-one_of("P")) %>%
map(~ .> df$P) %>%
reduce(`|`) %>%
extract(df, .,)
# A tibble: 3 × 3
#      P     B     C
#  <dbl> <dbl> <dbl>
#1   2.0   2.1   2.2
#2   5.0   5.5   5.7
#3   1.4   2.0   1.5

यह भी devel संस्करण का उपयोग करके एक फ़ंक्शन में बदला जा सकता है dplyr (जल्द ही रिलीज होगी 0.6.0) जो पेश किया quosures तथा unquote मूल्यांकन के लिए। enquo के लगभग समान है substitute से base R जो उपयोगकर्ता इनपुट लेता है और उसे रूपांतरित करता है quosure, one_of स्ट्रिंग तर्क लेता है, इसलिए इसे स्ट्रिंग में परिवर्तित किया जा सकता है quo_name

funFilter <- function(dat, colToCompare){
colToCompare <- quo_name(enquo(colToCompare))

dat %>%
select(-one_of(colToCompare)) %>%
map(~ .> dat[[colToCompare]]) %>%
reduce(`|`) %>%
extract(dat, ., )
}

funFilter(df, P)#compare all other columns with P
# A tibble: 3 × 3
#      P     B     C
#  <dbl> <dbl> <dbl>
#1   2.0   2.1   2.2
#2   5.0   5.5   5.7
#3   1.4   2.0   1.5

funFilter(df, B) #compare all other columns with B
# A tibble: 4 × 3
#      P     B     C
#  <dbl> <dbl> <dbl>
#1     2   2.1   2.2
#2     4   3.0   3.8
#3     5   5.5   5.7
#4     6   1.2   5.0

हम अभिव्यक्ति को पार्स भी कर सकते हैं

v1 <- setdiff(names(df), "P")
filter(df, !!rlang::parse_quosure(paste(v1, "P", sep=" > ", collapse=" | ")))
# A tibble: 3 × 3
#     P     B     C
#    <dbl> <dbl> <dbl>
#1   2.0   2.1   2.2
#2   5.0   5.5   5.7
#3   1.4   2.0   1.5

इसे फंक्शन में भी बनाया जा सकता है

funFilter2 <- function(dat, colToCompare){
colToCompare <- quo_name(enquo(colToCompare))
v1 <- setdiff(names(dat), colToCompare)
expr <- rlang::parse_quosure(paste(v1, colToCompare, sep= " > ", collapse= " | "))
dat %>%
filter(!!expr)
}

funFilter2(df, P)
# A tibble: 3 × 3
#      P     B     C
#  <dbl> <dbl> <dbl>
#1   2.0   2.1   2.2
#2   5.0   5.5   5.7
#3   1.4   2.0   1.5

funFilter2(df, B)
# A tibble: 4 × 3
#      P     B     C
#  <dbl> <dbl> <dbl>
#1     2   2.1   2.2
#2     4   3.0   3.8
#3     5   5.5   5.7
#4     6   1.2   5.0

या दूसरा तरीका हो सकता है pmax

df %>%
filter(do.call(pmax, .) > P)
# A tibble: 3 × 3
#      P     B     C
#   <dbl> <dbl> <dbl>
#1   2.0   2.1   2.2
#2   5.0   5.5   5.7
#3   1.4   2.0   1.5