【问题标题】:Change Operator in filtering based on condition in .R根据.R中的条件更改过滤中的运算符
【发布时间】:2023-03-13 15:33:01
【问题描述】:

我正在编写一个函数,它应该根据输入向量的长度以两种不同的方式过滤数据!

library(dplyr)
DF = function(country  = c("Belgium", "USA", "India")) {

operator = ifelse(length(country) == 1,  "|" , "&")

   some_data =  data %>% 
               filter(Actor1CountryCode %in% country   &   Actor2CountryCode %in% country)

   return( some_data )
   }

但如果我只选择country = "Germany",我希望运算符从“&”切换到“|”。

运算符应该以某种方式成为最终过滤器功能的一部分。我的“真实”过滤功能非常大,所以我只想使用一个过滤功能。 有人知道如何编写智能函数吗?

解决方案(如果您想复制):

library(dplyr)

data = data.frame( 
  Actor1CountryCode = c("Belgium", "USA", "India", "Pakistan", "Germany"),
  Actor2CountryCode = c("Belgium", "USA", "India", "Germany", "Russia") , 
  sentiment         = c(  1,2,3,4,5 )  )


DF <- function(country) {
  
   operator <- if (length(country) == 1)  `|` else  `&`
   
   some_data =  data %>% 
     filter(operator(Actor1CountryCode %in% country, Actor2CountryCode %in% country)) 

     return(some_data)
 }
 

DF(c("Belgium", "USA", "India"))
DF("Germany")  

【问题讨论】:

    标签: r function dplyr operators filtering


    【解决方案1】:

    您可以使用 `` 来像函数一样使用 | 运算符:

    `|`(TRUE, FALSE)
    [1] TRUE
    

    所以这是一种可能的解决方案:

    DF <- function(country) {
      
       operator <- if (length(country) == 1)  `|` else  `&`
       
       some_data =  data %>% 
         filter(operator(Actor1CountryCode %in% country, Actor2CountryCode %in% country)) 
     }
     
    
    DF(c("Belgium", "USA", "India"))
    DF("Germany")  
    

    【讨论】:

      【解决方案2】:

      您可以根据lengthcountry 应用不同的filter 函数:

      library(dplyr)
      
      DF = function(country = c("Belgium", "USA", "India") {
      
           if(length(country) == 1)
             some_data <-  data %>% filter(Actor1CountryCode == country | 
                                           Actor2CountryCode == country)
           else 
             some_data <-  data %>% filter(Actor1CountryCode %in% country & 
                                           Actor2CountryCode %in% country)
           return(some_data)
      }
      

      【讨论】:

        猜你喜欢
        • 2022-09-29
        • 1970-01-01
        • 2021-12-08
        • 2021-06-25
        • 2022-09-22
        • 2016-11-13
        • 1970-01-01
        • 2018-08-07
        • 2021-02-12
        相关资源
        最近更新 更多