Если имеется несколько столбцов, после группировки по «ID» используйте от summarise_at
до l oop над столбцами, создайте логический вектор с is.na
, получите mean
и умножьте на 100
library(dplyr)
df1 %>%
group_by(ID) %>%
summarise_at(vars(-group_cols()), ~ 100 *mean(is.na(.)))
Если мы хотим получить процент по всем другим переменным,
library(tidyr)
df1 %>%
pivot_longer(cols = -ID) %>%
group_by(ID) %>%
summarise(Perc = 100 * mean(is.na(value)))
Или с aggregate
из base R
aggregate(.~ ID, df1, FUN = function(x) 100 * mean(is.na(x)), na.action = na.pass)
Или, чтобы получить процентное соотношение, затем unlist
, остальные столбцы, создайте table
с логическим вектором и столбцом 'ID' и используйте prop.table
, чтобы получить процент
prop.table(table(cbind(ID = df1$ID,
value = is.na(unlist(df1[setdiff(names(df1), "ID")]))))