如何在R中对管道使用ifelse()

8yparm6h  于 2023-06-19  发布在  其他
关注(0)|答案(2)|浏览(127)

我刚刚开始使用管道如何让ifelse()使用管道
下面是一个可以工作的示例代码

x <- sample(-5:5,10,replace = T)
x
 [1]  0  0  2 -1  1  3  1  3  4 -2

 ifelse( sign(x) >= 0,1,-1)
 [1]  1  1  1 -1  1  1  1  1  1 -1

下面是我用管子做的不成功的尝试

x |> sign() |> ifelse(. >= 0, 1, -1)

Error in ifelse(sign(x), . >= 0, 1, -1) : unused argument (-1)
wxclj1h5

wxclj1h51#

你可以使用花括号和函数\(.)来管道一个向量,如下所示:

set.seed(7) # reproducibility
x <- sample(-5:5,10,replace = T)
x
#>  [1]  4 -3  1 -4  4  0  2  2 -3  2
x |>
  sign() |>
  {\(.) ifelse(. >= 0, 1, -1)}()
#>  [1]  1 -1  1 -1  1  1  1  1 -1  1

在使用RHS管道时,请确保在函数后面添加(),否则它会返回如下错误:

x |>
  sign() |>
  {\(.) ifelse(. >= 0, 1, -1)}

#> Error: function '{' not supported in RHS call of a pipe

创建于2023-06-07,使用reprex v2.0.2

bz4sfanl

bz4sfanl2#

请注意,sign不会改变输入和0之间的关系,因此删除它。现在(1)将>=放入一个单独的分支中,或者(2)创建一个列表,其中x作为其一个元素,后跟with,或者(3)做同样的事情,但使用算术表达式代替ifelse,或者(4)创建一个使用ifelse的函数。

# 1
x |>
  (`>=`)(0) |>
  ifelse(1, -1)

# 2
x |>
  list(x = _) |>
  with(ifelse(x >= 0, 1, -1))

# 3
x |>
  list(x = _) |>
  with((x >= 0) - (x < 0))

# 4
unity <- function(x) ifelse(x >= 0, 1, -1)
x |>
  unity()

另一种可能性是使用magrittr管道,在这种情况下,我们可以这样写:

library(magrittr)

x %>%
  { ifelse(. >= 0, 1, -1) }

相关问题