Цикл недостающих данных по годам

#r #loops

#r #циклы

Вопрос:

Мне нужно запустить цикл для моего набора данных, ds. dim ds составляет 4000, 11. Каждая страна мира представлена. И у каждой страны есть данные за период с 1970 по 1999 год.

Набор данных содержит недостающие данные среди своих 8 строк. Мне нужно запустить цикл, который вычисляет, сколько недостающих данных имеется В год. год указан в df $ year.

Я почти уверен, что годы (1970, 1971, 1972 …) являются числовыми значениями.

Это мой текущий код

 missingds<-c()
for (i in 1:length(ds)){
    missingds[names(ds)[i]]<-sum(is.na(ds[i]))/4000
}
 

Это дает мне долю отсутствующих данных на переменную ds. Я просто не могу понять, как заставить его сообщать о доле всех переменных в год.

У меня есть индикаторная переменная ds $ missing, которая сообщает 1, если в любом из столбцов этой строки есть NA, и 0, если нет.

Фотография дс

Ответ №1:

Чтобы подсчитать количество NA значений в каждом столбце с помощью dplyr, вы можете сделать :

 library(dplyr)

result <- data %>%
            group_by(Year) %>%
            summarise(across(gdp_growth:polity, ~sum(is.na(.))))
 

В базе R вы можете использовать aggregate :

 aggregate(cbind(gdp_growth, gdp_per_capita, inf_mort, pop_density, polity)~year, 
          data, function(x) sum(is.na(x)))
 

Замените sum на mean , если вы хотите подсчитать доли NA значений в каждом year .

Комментарии:

1. Как насчет того, чтобы не использовать dplyr?

2. @869picardy обновил ответ с помощью опции base R. Кстати, будет полезно, если вы разместите свои данные в воспроизводимом формате вместо скриншота. Мы не можем скопировать данные со снимка экрана.

Ответ №2:

Использование data.table

 library(data.table)
setDT(data)[, lapply(.SD, function(x) sum(is.na(x))),
    by = Year, .SDcols = gdp_growth:polity]