Мне нужна помощь в применении функции к четырем элементам, которые хранятся в одном списке.

Функция:

status_fun <- function(Status,
                       Escalated,
                       Created,
                       Resolved
                       ){
  if(Escalated == "Yes"){
    return("Escalated")
    } else if(Status == "Closed" && (month(Created) == month(Resolved) || Resolved - Created < 5
              )
    ){
      return("Closed")
    } else {
      return("Not Solved")
    }
}

У меня есть список с 4 плитами внутри разных размеров. Я просто хочу применить вышеописанную функцию, которая использует четыре столбца для каждого фрагмента, но я получаю всевозможные ошибки. Я искал столько, сколько смогу и читаю R4DS и другие сообщения здесь, но не могу найти решение.


dummy %>%
   map(., status_fun)
Error in .f(.x[[i]], ...) : 
 argument "Escalated" is missing with no default

dummy %>%
   map(~ map(., status_fun))
Error in .f(.x[[i]], ...) : 
  argument "Escalated" is missing with no default

Следующее возвращает список только с одним значением, которое меня не интересует. Я хочу получить список с четырьмя столбцами с такими же размерами (строками), как у

dummy %>%
   map(., ~ status_fun(Status = 'Status', Escalated = 'Escalated', Created = 'Created', Resolved = 'Resolved'))
[[1]]
[1] "Not Solved"

[[2]]
[1] "Not Solved"

[[3]]
[1] "Not Solved"

[[4]]
[1] "Not Solved"

Фиктивный список следующий:

[[1]]
# A tibble: 589 x 5
   Created    Resolved   Status      Country    Escalated
   <date>     <date>     <chr>       <chr>      <chr>    
 1 2020-04-03 2020-04-08 Closed      Luxembourg No       
 2 2020-03-31 NA         In Progress France     No       
 3 2020-03-31 NA         In Progress France     No       
 4 2020-03-31 NA         In Progress Luxembourg No       
 5 2020-03-31 NA         In Progress Luxembourg No       
 6 2020-03-30 NA         In Progress France     Yes       
 7 2020-03-27 NA         In Progress Ireland    No       
 8 2020-03-27 2020-04-10 Closed      Luxembourg No       
 9 2020-03-27 NA         In Progress Luxembourg No       
10 2020-03-27 2020-03-30 Closed      Ireland    No       
# ... with 579 more rows

[[2]]
# A tibble: 316 x 5
   Created    Resolved   Status               Country    Escalated
   <date>     <date>     <chr>                <chr>      <chr>    
 1 2020-04-13 NA         Open                 Luxembourg No       
 2 2020-04-13 NA         Open                 Spain      No       
 3 2020-04-07 NA         Open                 France     No       
 4 2020-04-03 NA         In Progress          Luxembourg No       
 5 2020-03-30 NA         Awaiting Information Luxembourg No       
 6 2020-03-30 NA         Awaiting Information France     Yes       
 7 2020-03-30 2020-03-31 Closed               France     No       
 8 2020-03-30 NA         Awaiting Information France     No       
 9 2020-03-30 NA         Awaiting Information Spain      No       
10 2020-03-30 NA         Awaiting Information Sweden     No       
# ... with 306 more rows

[[3]]
# A tibble: 64 x 5
   Created    Resolved   Status               Country Escalated
   <date>     <date>     <chr>                <chr>   <chr>    
 1 2020-04-13 NA         Open                 Chile   No       
 2 2020-04-10 NA         Open                 Mexico  Yes      
 3 2020-04-10 NA         Awaiting Information Mexico  No       
 4 2020-04-09 NA         Open                 Chile   No       
 5 2020-04-03 2020-04-06 Closed               Mexico  Yes       
 6 2020-04-02 2020-04-02 Closed               Mexico  No       
 7 2020-04-01 2020-04-01 Closed               Mexico  No       
 8 2020-03-31 2020-04-01 Closed               Brazil  No       
 9 2020-03-30 2020-03-31 Closed               Mexico  No       
10 2020-03-27 2020-04-06 Closed               Mexico  No       
# ... with 54 more rows

[[4]]
# A tibble: 30 x 5
   Created    Resolved   Status      Country Escalated
   <date>     <date>     <chr>       <chr>   <chr>    
 1 2020-04-13 NA         Open        Chile   No       
 2 2020-04-07 NA         Open        Brazil  No       
 3 2020-03-23 2020-03-25 Closed      Chile   No       
 4 2020-03-17 2020-03-18 Closed      Chile   No       
 5 2020-03-16 NA         Open        Mexico  No       
 6 2020-03-11 2020-03-11 Closed      Brazil  No       
 7 2020-03-11 2020-03-12 Closed      Brazil  No       
 8 2020-03-10 2020-03-10 Closed      Brazil  No       
 9 2020-03-09 NA         In Progress Brazil  No       
10 2020-03-02 2020-03-03 Closed      Brazil  No       
# ... with 20 more rows

Чего мне не хватает? Я пробовал все виды pmap, map_2, инструкции здесь Код не работает с использованием карты из пакета purrr в R а здесь применить функцию к вложенному циклу (пакет purrr?) без успеха .. Заранее спасибо за кого-то, кто готов уделить свое время решению моей проблемы.

> version        _                           
platform       x86_64-w64-mingw32          
arch           x86_64                      
os             mingw32                     
system         x86_64, mingw32             
status                                     
major          4                           
minor          0.0                         
year           2020                        
month          04                          
day            24                          
svn rev        78286                       
language       R                           
version.string R version 4.0.0 (2020-04-24)
nickname       Arbor Day  

packageVersion("tidyverse")
[1] ‘1.3.0’

packageVersion("lubridate")
[1] ‘1.7.8’
1
Luís Madeira 1 Май 2020 в 18:01

2 ответа

Одна проблема заключается в том, что вы передаете один data.frame в функцию, которая ожидает 4 аргумента. Чтобы исправить это, вы можете изменить свою функцию на:

new_fx = function (DF) {
Status = DF$Status
Escalated = DF$Escalated
...
}
map(dummy, new_fx)

Следующая потенциальная проблема - это использование if ... else.... Поскольку это был не воспроизводимый пример с ожидаемым выводом, я предполагаю, что вы хотите добавить столбец с оператором if ... else.... Вы захотите избавиться от двойных && и ||, потому что они будут иметь одно логическое значение.

Наряду с этим переключитесь на использование ifelse или, поскольку вы находитесь в , вы можете использовать case_when(), чтобы получить вектор ожидаемой длины.

2
Cole 2 Май 2020 в 11:52

Для любого, кто борется с изменяющимися столбцами в нескольких столбцах внутри объекта списка, приведенный ниже код работает над проблемой, описанной выше:

status_fun <- function(df){
  Escalated = df$Escalated
  Status = df$Status
  Created = df$Created
  Resolved = df$Resolved

  dplyr::mutate(df,
    Status = case_when(


      Escalated == "Yes" ~ "Escalated",


      (Status == "Closed" &


         (month(Created) == month(Resolved) | Resolved - Created < 5)) ~ "Closed",

      TRUE ~ "Not Solved"
    )
  )
}

dummy <-  dummy %>% map(., status_fun)
0
Luís Madeira 4 Май 2020 в 09:11