在条件dplyr链中使用基本的R管道符号。

4

我想知道如何在dplyr链中存在条件元素的情况下使用基本的|>管道代替tidyverse的%>%。当我尝试使用|>运行以下代码时,会出现错误:

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

使用Tidyverse的示例

library(tidyverse)

condition = FALSE

mtcars %>%
  { if(condition == TRUE)
    mutate(., mpg = mpg*1000)
    else . }

使用基本的R管道的示例(会导致错误):

mtcars |>
  { if(condition == TRUE)
    mutate(., mpg = mpg*1000)
    else . }
3个回答

5

可以运行,但是太……丑陋了 ;) - acircleda
也许可以看一下Does the Bizarro pipe ->.; have disadvantages making it not recommended for use?,作为另一个可能性。 - GKi

2

你能把条件放在mutate里面吗?

mtcars |>
  mutate(mpg = if (condition) mpg*1000 else mpg)
#                      mpg cyl  disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4           21.0   6 160.0 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag       21.0   6 160.0 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710          22.8   4 108.0  93 3.85 2.320 18.61  1  1    4    1
# Hornet 4 Drive      21.4   6 258.0 110 3.08 3.215 19.44  1  0    3    1
# ...

1
谢谢。在这个例子中它起作用了,但实际上我在条件语句中链接了几个函数。 - acircleda
我明白了,值得一提。 - r2evans

1

试试使用within

mtcars |> within(mpg[condition] <- mpg[condition]*1e3)

演示

condition <- FALSE
mtcars |> 
  within(mpg[condition] <- mpg[condition]*1e3) |>
  head(3)
#                mpg cyl disp  hp drat    wt  qsec vs am gear carb
# Mazda RX4     21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
# Mazda RX4 Wag 21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
# Datsun 710    22.8   4  108  93 3.85 2.320 18.61  1  1    4    1

condition <- TRUE
mtcars |> 
  within({
    mpg[cond] <- mpg[cond]*1e3
    am[cond] <- am[cond]*-999
  }) |>
  head(3)
#                 mpg cyl disp  hp drat    wt  qsec vs   am gear carb
# Mazda RX4     21000   6  160 110 3.90 2.620 16.46  0 -999    4    4
# Mazda RX4 Wag 21000   6  160 110 3.90 2.875 17.02  0 -999    4    4
# Datsun 710    22800   4  108  93 3.85 2.320 18.61  1 -999    4    1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接