让我分享一个我想做的事的例子,因为标题可能不像我希望的那样清晰。这没有可复制的代码,但是如果有帮助,我可以添加一个可复制的示例:

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”和“ lastname”列。

有更好的方法来执行此操作,而不是必须在两个单独的if else语句中再次创建整个dplyr管道吗?我实际的代码流水线每个都比4行长得多,因此必须像这样重现代码非常令人沮丧。

最佳答案

你可以做

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

关于r - 在R中的if语句为条件的情况下在dplyr中使用filter,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47624161/

10-13 05:44