Мы можем использовать summarise_at
после группирования по 'id', 'county'
library(dplyr)
df1 %>%
group_by(id, county) %>%
summarise_at(vars(-group_cols()), mean, na.rm = TRUE)
Если в конкретном столбце для групповой комбинации есть только NA
, это вернет NaN
как мы используем na.rm = TRUE
. Чтобы предотвратить это, мы можем иметь условие if/else
df1 %>%
group_by(id, county) %>%
summarise_at(vars(-group_cols()), ~ if(all(is.na(.)))
NA_real_ else mean(., na.rm = TRUE))
или другой параметр mean_
из hablar
library(hablar)
df1 %>%
group_by(id, county) %>%
summarise_at(vars(-group_cols()), mean_)
# A tibble: 4 x 5
# Groups: id [4]
# id county chemicalA chemicalB chemicalC
# <int> <chr> <dbl> <dbl> <dbl>
#1 1 a 0.2 NA NA
#2 2 b 0.25 0.2 NA
#3 3 c 0.05 NA 0.8
#4 4 d 0.25 NA 0.5
Или, если есть много других переменных, мы можем применить к цифрам c столбцы с summarise_if
df1 %>%
group_by(id, county) %>%
summarise_if(is.numeric, mean_)
Или для определенных c переменных, либо укажите имена столбцов, либо если в имени столбца есть какой-либо шаблон, то есть здесь имена столбцов начинается с «химического» * 1021 *
df1 %>%
group_by(id, county) %>%
summarise_at(vars(starts_with('chemical')), mean_)
data
df1 <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 4L, 4L, 4L),
county = c("a", "a", "a", "a", "b", "b", "c", "d", "d", "d"
), chemicalA = c(0.1, 0.3, 0.2, 0.2, 0.4, 0.1, 0.05, NA,
0.2, 0.3), chemicalB = c(NA, NA, NA, NA, 0.2, NA, NA, NA,
NA, NA), chemicalC = c(NA, NA, NA, NA, NA, NA, 0.8, 0.4,
0.5, 0.6)), class = "data.frame", row.names = c(NA, -10L))