让我分享一下我正在尝试做的事情的一个例子,因为标题可能不像我希望的那样清晰。这没有可重现的代码,但如果有帮助,我可以添加一个可重现的示例:
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'列过滤数据帧。如果我没有传递值 team_name参数,然后它默认为“”,而我传递this_name和that_name的值,它们对应于mydf中的列'firstname'和'lastname'。
有没有更好的方法来实现这一点,而不是必须在两个单独的if else语句中再次创建整个dplyr管道?我的实际代码管道长度超过4行,因此必须重现这样的代码是非常令人沮丧的。
答案 0 :(得分:14)
你可以做到
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
答案 1 :(得分:1)
查看以下代码是否有效,我们在if-else
语句中插入filter
条件。这是有道理的,因为后面的语句接受一个逻辑语句作为其输入 - 我们只使用前一个语句来控制输入的值。
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)
答案 2 :(得分:0)
基于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)
如果要评估的条件多于两个,这会更好。