Поместите петли в функцию - PullRequest
1 голос
/ 13 апреля 2020

У меня есть список циклов for, которые я хотел бы встроить в функцию. Однако, результат, данный этой функцией, равен NULL. Вот пример:

library(dplyr)

test <- tibble(
  group = rep(c("A", "B"), each = 6),
  id = rep(rep(1:2, each = 3), 2),
  foo = c(1998, 2000, 2004, 1997, 1998, 1999, 2006, 2008, 2010, 2009, 2010, 2011)
)

# A tibble: 12 x 3
   group    id   foo
   <chr> <int> <dbl>
 1 A         1  1998
 2 A         1  2000
 3 A         1  2004
 4 A         2  1997
 5 A         2  1998
 6 A         2  1999
 7 B         1  2006
 8 B         1  2008
 9 B         1  2010
10 B         2  2009
11 B         2  2010
12 B         2  2011

Я пытался адаптировать следующее l oop:

for (i in c("A", "B")){
  test <- test %>%
    mutate(
      foo = case_when(
        group == i & id == 1 ~ "foo_1",
        group == i & id == 2 ~ "foo_2",
        TRUE ~ as.character(foo)
      ))
}
test

с помощью этой функции:

test_function <- function(x, y){
  x <- enquo(x)
  y <- enquo(y)

  for (i in c("A", "B")){
    test <- test %>%
      mutate(
        !!x := case_when(
          group == i & (!!y) == 1 ~ "foo_1",
          group == i & (!!y) == 2 ~ "foo_2",
          TRUE ~ as.character(!!(x))
        ))
  }
}

Но test_function(foo, id) возвращает что-то NULL.

Вот мой ожидаемый результат (я знаю, что его можно получить без l oop, но здесь я хотел бы знать, как встроить al oop в функцию):

# A tibble: 12 x 4
   group    id   foo something
   <chr> <int> <dbl> <chr>    
 1 A         1  1998 foo_1    
 2 A         1  2000 foo_1    
 3 A         1  2004 foo_1    
 4 A         2  1997 foo_2    
 5 A         2  1998 foo_2    
 6 A         2  1999 foo_2    
 7 B         1  2006 foo_1    
 8 B         1  2008 foo_1    
 9 B         1  2010 foo_1    
10 B         2  2009 foo_2    
11 B         2  2010 foo_2    
12 B         2  2011 foo_2   

Как я могу поместить этот l oop в функцию? Обратите внимание, что я хотел бы поместить множество циклов в уникальную функцию.

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