Эквивалент следующего в мурлыкании :: map_df - PullRequest
1 голос
/ 16 апреля 2019

Я ищу эквивалент следующий в циклах для вызова 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(.))

В приведенном выше коде, что я могу использовать вместо Result <- NULL в уродливом операторе if (т.е.Я хочу просто проверить условие и эффективно выполнить «следующее»).

Ответы [ 3 ]

3 голосов
/ 16 апреля 2019

Для выхода из функции вы можете использовать команду 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 голосов
/ 16 апреля 2019

Логика не очень отличает решение от 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 голос
/ 16 апреля 2019

Вот еще один способ взглянуть на это, используя 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()

Таким образом, функция становится чище, и вы также получаете хороший журнал ошибок

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...