Из того, что я понимаю, сначала вы хотите посчитать количество NA за квартал. Чтобы сделать это, вы должны преобразовать свой объект в формат, которым вы можете управлять легче. После нескольких исследований, вот что вы можете сделать, чтобы получить данные в нужном формате:
library(dplyr)
library(zoo)
library(lubridate)
library(tidyr)
# Load the dataset
data("presidents")
class(presidents)
# Convert your ts data
df <- data.frame(Y=as.matrix(presidents), date=time(presidents))
# Get your data in a more familiar format
df <- df %>%
mutate(yearmon = as.yearmon(date)) %>%
mutate(year = year(yearmon)) %>%
mutate(quarter = paste0("Q", quarter(yearmon))) %>%
select(c(year, quarter, Y)) %>%
pivot_wider(names_from = quarter, values_from = Y)
#Edit : remove the last row if you want your data in a long format
После того, как это будет сделано, вы можете go вернуться, чтобы выполнить
colSums(is.na(df))
* 1006. * Наконец, вы можете удалить все строки, содержащие NA, с помощью
df_nona <- df %>%
drop_na()
Пожалуйста, будьте осторожны, поскольку, как и другие, упомянутые в комментариях, всегда спрашивайте себя, почему вы думаете, что вы должны удалить свои NA. Если вы хотите вычислить среднее значение, вы всегда можете na.rm=T
, если вам нужно. В противном случае вы также можете отбросить эти наблюдения, если хотите, но тогда вам понадобятся ваши данные в длинном формате (см. Комментарий в коде выше)