R - 来自dplyr的mutate_if中的自己的函数

问题描述 投票:0回答:2

为了使用dplyr中的函数mutate_if(),我只能通过定义上游函数找到一种方法,如下所示:

library(dplyr)    
data(iris)

f1 <- function(x){ max(x) < 1 }
f2 <- function(x){ x / max(x) }

df <- iris %>%
   mutate_if(f1, f2)

有没有办法,比如在vars()中使用funs()mutate_at()这个参数来定义mutate_if()中的函数,而不是之前没有必要?

r dplyr
2个回答
3
投票

当然,您可以在mutate_if调用中使用匿名函数:

head(iris)
  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          5.1         3.5          1.4         0.2  setosa
2          4.9         3.0          1.4         0.2  setosa
3          4.7         3.2          1.3         0.2  setosa
4          4.6         3.1          1.5         0.2  setosa
5          5.0         3.6          1.4         0.2  setosa
6          5.4         3.9          1.7         0.4  setosa

# mimic use of is_numeric, then add +2 to each column
iris %>%
    mutate_if(function(x) is.numeric(x),
              function(x) x + 2) %>%
    head

# Or using the newer syntax (thanks to @akrun):
iris %>%
    mutate_if(~ is.numeric(.),
              ~ . + 2) %>%
    head

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1          7.1         5.5          3.4         2.2  setosa
2          6.9         5.0          3.4         2.2  setosa
3          6.7         5.2          3.3         2.2  setosa
4          6.6         5.1          3.5         2.2  setosa
5          7.0         5.6          3.4         2.2  setosa
6          7.4         5.9          3.7         2.4  setosa

在你的情况下,你max给出一个错误,如果给它非数字数据,所以我们需要在进入你的真实测试之前检查它是数字,但它的工作原理很好:

iris %>%
    mutate_if(function(x) if (is.numeric(x)) max(x) > 1 else FALSE,
              function(x) x / max(x)) %>%
    head

  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1    0.6455696   0.7954545    0.2028986        0.08  setosa
2    0.6202532   0.6818182    0.2028986        0.08  setosa
3    0.5949367   0.7272727    0.1884058        0.08  setosa
4    0.5822785   0.7045455    0.2173913        0.08  setosa
5    0.6329114   0.8181818    0.2028986        0.08  setosa
6    0.6835443   0.8863636    0.2463768        0.16  setosa

0
投票

只是想注意你也可以使用purrr表示法:

iris %>%
  mutate_if(~ if (is.numeric(.x)) max(.x) > 1 else FALSE,
            ~ .x / max(.x)) 
© www.soinside.com 2019 - 2024. All rights reserved.