Hello @help ,
I have tried to address your question. If I have understood correctly, you need 4 different data frames after looping through the function you have written. Please see the below code and output, it may be of some use.
> library(tidyverse)
>
> # data from post
>
> structure(list(animal_type = c("cow", "dog", "dog", "dog", "cow",
+ "monkey", "giraffe", "giraffe", "cow"),
+ animal_name = c("Ant","Sophia", "Ann", "Jill", "Jim", "Jim",
+ "Rita", "Anna", "Rita"
+ )),
+ class = c("tbl_df", "tbl", "data.frame"),
+ row.names = c(NA, -9L)) -> all_animals
>
>
> remove_animal <- c("Ant", "Ann", "Jim", "Rita")
>
>
> animal_function <- function(select_animal) {
+
+ animal_df <- all_animals %>%
+ filter((!animal_name %in% remove_animal & animal_name != select_animal), # this condition is written in a manner that gegnerates the samem out put no matter what is provided as an input for select_animal
+ animal_type != "cow")
+
+ return(animal_df)
+ }
>
>
> ## Possible solutions/approaches
>
> lapply(X = remove_animal,FUN = animal_function) # returns a list of data, you were super close
[[1]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[2]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[3]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[4]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
>
> purrr::map(remove_animal,animal_function) # does the same using purrr
[[1]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[2]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[3]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[4]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
>
> ## using a loop
>
> list_of_df <- vector(mode='list', length=length(remove_animal)) # create an empty list
>
> for (i in seq_along(remove_animal)) {
+
+ list_of_df[[i]] <- animal_function(remove_animal[i])
+
+ }
>
> list_of_df
[[1]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[2]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[3]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
[[4]]
# A tibble: 3 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 giraffe Anna
>
> ## maybe this is the function that works better
>
>
> animal_function2 <- function(select_animal) {
+
+ animal_df <- all_animals %>%
+ filter((animal_name != select_animal), # edited condition
+ animal_type != "cow")
+
+ return(animal_df)
+ }
>
> lapply(X = remove_animal,FUN = animal_function2)
[[1]]
# A tibble: 6 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 monkey Jim
5 giraffe Rita
6 giraffe Anna
[[2]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 monkey Jim
4 giraffe Rita
5 giraffe Anna
[[3]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 giraffe Rita
5 giraffe Anna
[[4]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 monkey Jim
5 giraffe Anna
>
> purrr::map(remove_animal,animal_function2) # does the same using purrr
[[1]]
# A tibble: 6 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 monkey Jim
5 giraffe Rita
6 giraffe Anna
[[2]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 monkey Jim
4 giraffe Rita
5 giraffe Anna
[[3]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 giraffe Rita
5 giraffe Anna
[[4]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 monkey Jim
5 giraffe Anna
>
> ## using a loop
>
> list_of_df <- vector(mode='list', length=length(remove_animal)) # create an empty list
>
> for (i in seq_along(remove_animal)) {
+
+ list_of_df[[i]] <- animal_function2(remove_animal[i])
+
+ }
>
> list_of_df
[[1]]
# A tibble: 6 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 monkey Jim
5 giraffe Rita
6 giraffe Anna
[[2]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Jill
3 monkey Jim
4 giraffe Rita
5 giraffe Anna
[[3]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 giraffe Rita
5 giraffe Anna
[[4]]
# A tibble: 5 × 2
animal_type animal_name
<chr> <chr>
1 dog Sophia
2 dog Ann
3 dog Jill
4 monkey Jim
5 giraffe Anna
Hope this helps,
Ayush