В настоящее время у меня есть 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),]

Любая помощь, чтобы быстро сделать это с помощью обобщения или функции, была бы действительно полезной.

r csv
0
Ben Arancibia 28 Янв 2015 в 19:26

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))
1
akrun 28 Янв 2015 в 17:07

Отсутствует <- сумма (is.na (df $ Donor)) отсутствует

1
Abdallah Zaben 10 Фев 2015 в 09:48