Я пытаюсь понять, как правильно отформатировать комбинацию lapply, rbind и do.call в операторе, и не могу заставить оператор работать правильно. Я предоставил простой пример функции и данных, которые я использую, чтобы попытаться понять форматирование. Я полностью понимаю, что сценарий, который я предоставил, можно запустить с использованием более простого метода, цель которого - просто понять форматирование и то, как использовать lapply и rbind для пользовательской функции.
Вот некоторые тестовые данные:
facility_id patient_number test_result
123 1000 25
123 1000 30
25 1001 12
25 1002 67
25 1010 75
65 1009 8
22 1222 95
22 1223 89
По сути, я пытаюсь подмножить данные внутри пользовательской функции, используя список значений идентификатора объекта, а затем хочу связать вместе каждую таблицу данных, полученную в результате пользовательской функции.
Вот код, который я использовал:
facilities_id_list<-c(123, 25)
facility_counts<-function(facilities_id_list){
facility<-facilities_id_list[[i]]
subset<-data[facility_id==facility]
}
results <- do.call("rbind", lapply(seq_along(facilities_id_list), function(i) facility_counts)
Результат, которого я надеюсь достичь:
facility_id patient_number test_result
123 1000 25
123 1000 30
25 1001 12
25 1002 67
25 1010 75
Почему это не работает? Нужно ли менять форматирование?
Вместо использования == используйте %in% для прямого подмножества
subset(data, facility_id %in% facilities_id_list)
В коде OP есть несколько проблем: 1) входным аргументом является facilities_id_list, где, как и в lapply, мы зацикливаемся на последовательности i., 2) facility_id==facility должно быть data$facility_id==facility, поскольку мы используем [, и нет привязки данных, 3 ) Нам нужно указать, что мы подмножаем индекс строки, так как по умолчанию без каких-либо ,, он берется как индекс столбца в data.frame
facility_counts<-function(i){
facility<-facilities_id_list[[i]]
data[data$facility_id == facility, ]
}
> do.call(rbind, lapply(seq_along(facilities_id_list), facility_counts))
facility_id patient_number test_result
1 123 1000 25
2 123 1000 30
3 25 1001 12
4 25 1002 67
5 25 1010 75
Вот пример использования старой доброй filter, а затем еще один вариант использования пользовательской функции с do.call():
library(dplyr)
# data
df <- tibble::tribble(
~facility_id, ~patient_number, ~test_result,
123L, 1000L, 25L,
123L, 1000L, 30L,
25L, 1001L, 12L,
25L, 1002L, 67L,
25L, 1010L, 75L,
65L, 1009L, 8L,
22L, 1222L, 95L,
22L, 1223L, 89L
)
facilities_id_list<-c(123, 25)
# simplest solution: just using filter
df %>%
filter(facility_id %in% facilities_id_list)
#> # A tibble: 5 × 3
#> facility_id patient_number test_result
#> <int> <int> <int>
#> 1 123 1000 25
#> 2 123 1000 30
#> 3 25 1001 12
#> 4 25 1002 67
#> 5 25 1010 75
# using custom function + do.call
custom_filter <- function(data) {
data %>%
filter(facility_id %in% facilities_id_list)
}
do.call(custom_filter, list(df))
#> # A tibble: 5 × 3
#> facility_id patient_number test_result
#> <int> <int> <int>
#> 1 123 1000 25
#> 2 123 1000 30
#> 3 25 1001 12
#> 4 25 1002 67
#> 5 25 1010 75
Как указано в моем описании, я полностью понимаю, что этого можно достичь с помощью более простого метода (т.е. функции подмножества), но я пытаюсь понять, как правильно форматировать lapply, rbind и do.call, поэтому мне нужен результат, используя что. @akrun