【问题标题】:Using %>% and ifelse() inside a function在函数中使用 %>% 和 ifelse()
【发布时间】:2020-04-02 11:28:56
【问题描述】:

我想运行一个函数来测试一个值是否存在于数据集中。我一直在寻找答案,并找到了一种解决方法,但它并不那么整洁,我很好奇为什么我最初的尝试失败了。

这是一个简化的数据集

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

如果存在特定的国家代码和年份,我希望我的函数返回 1,否则返回 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

但是为什么这个替代代码不起作用?有没有变种?

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)

谢谢!

【问题讨论】:

  • 为什么要返回10 而不是TRUEFALSE

标签: r function if-statement


【解决方案1】:

但是为什么这个替代代码不起作用?

因为x %&gt;% f(y)f(x, y) 相同。因此你写的代码等于

ifelse(filter(df, year == y), x %in% country, 1, 0)

...ifelse 函数不是这样工作的。

相反,你可以写

df %>% filter(year == y) %>% pull(country) %>% {ifelse(x %in% ., 1, 0)}

这里你需要用{…}包围ifelse函数调用,以防止管道将右侧作为第一个参数插入到函数调用中(我们希望使用x %in% .作为第一个参数而不是不仅仅是.)。

…或者,如果你已经加载了“magrittr”包,你可以使用%$%而不是%&gt;% pull(…) %&gt;% {…}

df %>% filter(year == y) %$% ifelse(x %in% country, 1, 0)

【讨论】:

    猜你喜欢
    • 2017-09-01
    • 2015-07-11
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多