Cia*_*ian 3 if-statement r function
我想运行一个函数来测试数据集中是否存在一个值。我一直在寻找答案,后来找到了一种解决方法,但它并不那么整洁,我很好奇为什么我最初的尝试失败了。
这是一个简化的数据集
df <- structure(list(country = structure(c(1L, 1L, 1L, 2L, 2L, 2L), .Label = c("IRE","USA"),
class = "factor"), year = structure(c(1L, 2L, 3L, 1L, 2L, 3L), .Label = c("1990", "1995", "2000"),
class = "factor")), class = "data.frame", row.names = c(NA, -6L))
> df
country year
1 IRE 1990
2 IRE 1995
3 IRE 2000
4 USA 1990
5 USA 1995
6 USA 2000
Run Code Online (Sandbox Code Playgroud)
1如果存在特定的国家/地区代码和年份,我希望我的函数返回a,0否则返回。这是工作代码:
myFunc <- function(x,y){
p.ans <- df %>% filter(year == y)
ifelse(x %in% p.ans$country, 1, 0)
}
> myFunc("USA", 1995)
[1] 1
> myFunc("USA", 1997)
[1] 0
Run Code Online (Sandbox Code Playgroud)
但是为什么这个替代代码不起作用?它有变化吗?
myFunc <- function(x,y){
df %>% filter(year == y) %>% ifelse(x %in% country, 1, 0)
}
> myFunc("USA", 1997)
Error in ifelse(., x %in% country, 1, 0) : unused argument (0)
Run Code Online (Sandbox Code Playgroud)
谢谢!
但是为什么这个替代代码不起作用?
因为x %>% f(y)和f(x, y). 因此你写的代码等于
ifelse(filter(df, year == y), x %in% country, 1, 0)
Run Code Online (Sandbox Code Playgroud)
……这不是ifelse函数的工作方式。
相反,你可以写
df %>% filter(year == y) %>% pull(country) %>% {ifelse(x %in% ., 1, 0)}
Run Code Online (Sandbox Code Playgroud)
在这里,您需要将ifelse函数调用用 括起来,{…}以防止管道将右侧作为第一个参数插入到函数调用中(我们希望将其x %in% .用作第一个参数,而不仅仅是.)。
...或者,如果您已经加载了 'magrittr' 包,您可以使用%$%代替%>% pull(…) %>% {…}:
df %>% filter(year == y) %$% ifelse(x %in% country, 1, 0)
Run Code Online (Sandbox Code Playgroud)