В настоящее время у меня есть csv, который загружается как фрейм данных в R с 2500 наблюдениями и 49 столбцами. Данные выглядят следующим образом:
Donor Year Amount
World Bank 2006 94,000
World Bank 2007
World Bank 80,000
Я пытаюсь подсчитать все недостающие значения в CSV по донору (который является столбцом), а затем разделить его на общее количество наблюдений, чтобы получить соотношение недостающих данных на одного донора.
Для приведенного выше примера, в котором отсутствуют 2 поля и всего 9 полей, математика будет выглядеть примерно так:
2NA / 9total полей.
donor_empty_iati<- group_by(chad_iati, reporting.org)
summary_donor_empty_iati <- summarise(donor_empty_iati, count_empty = length(which(n==""|n==" ")), total_by_donor = count_empty/nrow*49)
order_summary_donor_empty_iati <- summary_donor_empty_iati[order(-summary_donor_empty_iati$total_by_donor),]
Любая помощь, чтобы быстро сделать это с помощью обобщения или функции, была бы действительно полезной.
2 ответа
Вы можете попробовать это с data.table
. Преобразуйте data.frame в data.table с помощью setDT
. Получите «количество» (.N
) группирующей переменной («Донор»). По умолчанию столбец будет называться «N». Вместо того, чтобы работать с «широким» форматом, в этом случае может быть лучше преобразовать столбцы в один столбец «V2» (unlist(.SD)
. Сгруппированные по «Донору», мы можем получить общее количество {{X4} } в «V2» (sum(is.na(V2))
) и разделите его на сумму .N
(которая будет равна 6 для двух столбцов) и «N» (3).
library(data.table)
setDT(df)[, list(.N,unlist(.SD)), Donor][,
list(Count=sum(is.na(V2))/(.N+N[1])), Donor]
# Donor Count
#1: World Bank 0.2222222
Или решение base R
с использованием split
и vapply
. Разделите набор данных по столбцу «Донор» и получите сумму значений NA (is.na(x)
возвращает матрицу), разделенную на длину as.matrix(x)
(т.е. 9)
vapply(split(df, df$Donor),
function(x) sum(is.na(x))/length(as.matrix(x)), double(1L))
#World Bank
#0.2222222
Или как предложил @Marat Talipov
vapply(split(df, df$Donor),
function(x) mean(is.na(x)), double(1L))
Отсутствует <- сумма (is.na (df $ Donor)) отсутствует
Похожие вопросы
Новые вопросы
r
R — это бесплатный язык программирования с открытым исходным кодом и программная среда для статистических вычислений, биоинформатики, визуализации и общих вычислений. Пожалуйста, используйте минимально воспроизводимые примеры, которые другие могут запустить с помощью копирования и вставки. Показать желаемый результат полностью. Используйте dput() для данных и укажите все небазовые пакеты с помощью library(). Не вставляйте изображения для данных или кода, вместо этого используйте блоки кода с отступом. Для вопросов по статистике используйте https://stats.stackexchange.com.