我正在为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
(即我想简单地检查条件并有效地执行“下一步”)。
要退出函数,可以使用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(.))
逻辑上并不是一个与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
这是使用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()
通过这种方式,该功能变得更加清晰,您还可以获得错误的错误日志