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