在purrr :: map_df中等效于next

问题描述 投票:1回答:3

我正在为purrr :: map_df调用寻找下一个循环的等价物。

map_df可以很好地处理NULL的数据帧(如下例所示),所以当我在下面的例子中设置Result <- NULL时它可以正常工作。

任何人都可以建议我下面的插图的一般解决方案,不需要我设置Result <- NULL,而是立即去“下一步”。

library(tidyverse)
set.seed(1000)

df <- data.frame(x = rnorm(100), y = rnorm(100), z = rep(LETTERS, 100))

Map_Func <- function(df) {

  Sum_Num <- suppressWarnings(sqrt(sum(df$y)))

  if( Sum_Num == "NaN" ) {

    Result <- NULL
    # I would like to have an equivalent to "next" here... 

    } else {

  Result <- df %>% filter(y == max(y)) %>% mutate(Result = x*y)

}

Result

}

Test <- split(df, df$z) %>% map_df(~Map_Func(.))

在上面的代码中,我可以在丑陋的if语句中使用什么代替Result <- NULL(即我想简单地检查条件并有效地执行“下一步”)。

r tidyverse purrr
3个回答
3
投票

要退出函数,可以使用return(<output>)命令。这会立即使用您定义的输出退出函数。下面给出了您使用示例代码获得的相同输出。

library(tidyverse)
set.seed(1000)

df <- data.frame(x = rnorm(100), y = rnorm(100), z = rep(LETTERS, 100))

Map_Func <- function(df) {

  Sum_Num <- suppressWarnings(sqrt(sum(df$y)))

  if( Sum_Num == "NaN" ) {

    return(NULL)

  } 

  Result <- df %>% filter(y == max(y)) %>% mutate(Result = x*y)
}

Test <- split(df, df$z) %>% map_df(~Map_Func(.))

2
投票

逻辑上并不是一个与OP完全不同的解决方案,而是试图通过使用单独的功能来保持其清洁。 custom_check功能是检查每组的状况。使用map_if我们仅在Map_Func_true返回custom_check时应用函数TRUE或者应用返回Map_Func_false并最终绑定行的NULL

library(tidyverse)

Map_Func_true <- function(df) {
  df %>% filter(y == max(y)) %>% mutate(Result = x*y)
}

Map_Func_false <- function(df) { return(NULL) }

custom_check <- function(df) {
    !is.nan(suppressWarnings(sqrt(sum(df$y))))
}


df %>%
  group_split(z) %>%
  map_if(., custom_check, Map_Func_true, .else = Map_Func_false) %>%
  bind_rows()


# A tibble: 26 x 4
#       x     y z     Result
#   <dbl> <dbl> <fct>  <dbl>
# 1  1.24  2.00 A       2.47
# 2  1.24  2.00 A       2.47
# 3  1.24  2.00 C       2.47
# 4  1.24  2.00 C       2.47
# 5  1.24  2.00 E       2.47
# 6  1.24  2.00 E       2.47
# 7  1.24  2.00 G       2.47
# 8  1.24  2.00 G       2.47
# 9  1.24  2.00 I       2.47
#10  1.24  2.00 I       2.47
# … with 16 more rows

1
投票

这是使用purrr::safely查看它的另一种方式

Map_Func <- function(df) {

  Sum_Num <- suppressWarnings(sqrt(sum(df$y)))

  df %>% filter(y == max(y)) %>% mutate(Result = x*y)

}

Test <- split(df, df$z) %>% 
  map(safely(~Map_Func(.))) %>% 
  transpose() %>% 
  pluck("result") %>% # use 'error' here to get the error log
  bind_rows()

通过这种方式,该功能变得更加清晰,您还可以获得错误的错误日志

© www.soinside.com 2019 - 2024. All rights reserved.