Use filter in dplyr conditional on an if statement in R



让我分享一个我要做的事情的示例,因为标题可能不像我想要的那样清楚。这没有可再现的代码,但是我可以添加一个可重复的示例,如果有帮助:

library(dplyr)
if(this_team != "") {
  newdf <- mydf %>%    
      filter(team == this_team) %>%
      mutate(totalrows = nrow(.)) %>%
      group_by(x1, y1) %>%
      summarize(dosomestuff)
} else {
  newdf <- mydf %>%    
      filter(firstname == this_name & lastname == that_name) %>%
      mutate(totalrows = nrow(.)) %>%
      group_by(x1, y1) %>%
      summarize(dosomestuff)
}

我正在在R中创建一个函数,该函数在MyDF数据框架上进行一些数据操作。如果我将值传递给函数的team_name参数,那么我想使用"团队"列过滤数据框。如果我不将价值传递给team_name参数,然后默认为",而我将this_name和that_name的值传递给对应于mydf中的列" firstName"one_answers" lastName"的值。

是否有更好的方法可以做到这一点,而不必在其他两个单独的语言中再次在两个单独的dplyr管道中创建整个Dplyr管道?我的实际代码管道比每行要长得多,因此必须重现这样的代码。

您可以做

library(dplyr)
y <- ""
data.frame(x = 1:5) %>% 
  {if (y=="") filter(., x>3) else filter(., x<3)} %>% 
  tail(1)

data.frame(x = 1:5) %>% 
 filter(if (y=="") x>3 else x<3) %>%  
  tail(1)

,甚至将管道存储在

的静脉中
mypipe <- . %>% tail(1) %>% print
data.frame(x = 1:5) %>% mypipe

在Lukea的评论上构建,您也可以使用case_when()

library(dplyr)
y <- ""
data.frame(x = 1:5) %>% 
  filter(case_when(y=="" ~ x > 3, #When y == "", x > 3
                   T ~ x<3) #Otherwise, x < 3
         ) %>% 
  tail(1)

这会更好,特别是如果您有两个以上的评估条件。

查看以下代码是否有效,在 filter语句中插入 if-else条件。这是有道理的,因为后一个语句接受逻辑语句作为其输入 - 我们只使用前面的语句来控制输入的值。

library(dplyr)
newdf <- mydf %>%    
  filter(
    if (this_team != "") {
      team == this_team
    } else {
      firstname == this_name & lastname == that_name
    }
  ) %>%
  mutate(totalrows = nrow(.)) %>%
  group_by(x1, y1) %>%
  summarize(dosomestuff)

最新更新