Мне нужно извлечь несколько строк и столбцов из фрейма данных:
library(dplyr)
foo <- structure(list(iso3c = c("SWZ", "SVN", "NZL", "JAM", "ESP", "LSO",
"ATG", "GEO", "GIB", "BHS"), country = c("Eswatini", "Slovenia",
"New Zealand", "Jamaica", "Spain", "Lesotho", "Antigua & Barbuda",
"Georgia", "Gibraltar", "Bahamas"), confirmed = c(1, 141, 1522, 0, 148220, 4,
19, 794, NA, 102), deaths = c(0, 0, 22, 0, 14792, 0, 2, 12, NA,
11)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame"
))
compute_epidemic_curve_data <- function(df, country_code) {
epidemic_curve_data <- df %>%
filter(iso3c == country_code) %>%
select(iso3c,
country,
confirmed)
return(epidemic_curve_data)
}
print(result <- compute_epidemic_curve_data(foo, "SVN"))
Однако данные могут поступать из разных источников, а это означает, что иногда фрейм данных будет иметь другую структуру. Обычно столбец iso3c
называется id
, столбец country
называется admin_region
, и присутствует дополнительный столбец с именем tests
. Например:
bar <- structure(list(id = c("SWZ", "SVN", "NZL", "JAM", "ESP", "LSO",
"ATG", "GEO", "GIB", "BHS"), admin_region = c("Eswatini", "Slovenia",
"New Zealand", "Jamaica", "Spain", "Lesotho", "Antigua & Barbuda",
"Georgia", "Gibraltar", "Bahamas"), confirmed = c(1, 141, 1522, 0, 148220, 4,
19, 794, NA, 102), deaths = c(0, 0, 22, 0, 14792, 0, 2, 12, NA,
11), tests = c(2, 282, 3044, 0, 296440, 8, 38, 1588, NA, 204)), row.names = c(NA,
-10L), class = c("tbl_df", "tbl", "data.frame"))
Теперь, compute_epidemic_curve_data
также должен возвращать tests
, то есть он становится:
compute_epidemic_curve_data <- function(df, country_code) {
epidemic_curve_data <- df %>%
filter(id == country_code) %>%
select(id,
admin_region,
date,
confirmed,
tests)
return(epidemic_curve_data)
}
Вариант решения barbari c:
compute_epidemic_curve_data <- function(df, country_code) {
if("id" %in% colnames(df))
{
epidemic_curve_data <- df %>%
filter(id == country_code) %>%
select(id,
admin_region,
date,
confirmed,
tests)
}
else
{
epidemic_curve_data <- df %>%
filter(iso3c == country_code) %>%
select(iso3c,
country,
date,
confirmed)
}
return(epidemic_curve_data)
}
, но дублировать такой объем кода - плохая идея. Возможно ли, чтобы одна и та же функция обрабатывала два источника данных, в то же время уменьшая дублирование кода?