Формат оператора do.call

Я пытаюсь понять, как правильно отформатировать комбинацию 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

Почему это не работает? Нужно ли менять форматирование?

Laravel с Turbo JS
Laravel с Turbo JS
Turbo - это библиотека JavaScript для упрощения создания быстрых и высокоинтерактивных веб-приложений. Она работает с помощью техники под названием...
Типы ввода HTML: Лучшие практики и советы
Типы ввода HTML: Лучшие практики и советы
HTML, или HyperText Markup Language , является стандартным языком разметки, используемым для создания веб-страниц. Типы ввода HTML - это различные...
Аутсорсинг разработки PHP для индивидуальных веб-решений
Аутсорсинг разработки PHP для индивидуальных веб-решений
Услуги PHP-разработки могут быть экономически эффективным решением для компаний, которые ищут высококачественные услуги веб-разработки по доступным...
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
Слишком много useState? Давайте useReducer!
Слишком много useState? Давайте useReducer!
Современный фронтенд похож на старую добрую веб-разработку, но с одной загвоздкой: страница в браузере так же сложна, как и бэкенд.
Узнайте, как использовать теги &lt;ul&gt; и &lt;li&gt; для создания неупорядоченных списков в HTML
Узнайте, как использовать теги <ul> и <li> для создания неупорядоченных списков в HTML
HTML предоставляет множество тегов для структурирования и организации содержимого веб-страницы. Одним из наиболее часто используемых тегов для...
1
0
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вместо использования == используйте %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

Как указано в моем описании, я полностью понимаю, что этого можно достичь с помощью более простого метода (т.е. функции подмножества), но я пытаюсь понять, как правильно форматировать lapply, rbind и do.call, поэтому мне нужен результат, используя что. @akrun

bziggy 10.01.2023 22:42

Вот пример использования старой доброй 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

Другие вопросы по теме