#r #dplyr #time-series #missing-data
Вопрос:
Я хотел бы использовать gg_miss_var() из naniar
пакета, чтобы посмотреть количество отсутствующих данных в каждый момент времени в моем фрейме данных. Фрейм данных включает данные временных рядов в длинном формате.
У меня есть код, который работает с df в целом (см. № 1 в Коде ниже). Как я могу расширить это, чтобы получить результат, разделенный по времени (см. № 2 в Коде ниже для моей попытки кода)?
Чтобы уточнить, что я хотел бы сделать, это, по сути, повторить #1 в коде, используя данные из каждой точки времени (для переменной точки времени). Поэтому количество отсутствующих данных для каждой переменной будет представлено для базовых данных, данных за 1 год и данных за 2 года отдельно. В настоящее время #1 в Коде рассматривает недостающие данные для всех временных точек (т. е. базовой линии, года 1, года 2) вместе взятых.
Я буду проводить дальнейшие анализы, разделенные по времени, с помощью этих данных df, например, регрессий, и поэтому в идеале мне нужен код, которым легко манипулировать для этих целей.
Ниже приведен пример фрейма данных (см. Пример данных). Обратите внимание, что фрейм данных, с которым я работаю, намного больше (т. Е. N = ~21 900)
Код
library(tidyverse)
library(naniar) # for gg_miss_var()
# 1. All missing data
gg_miss_var(df[,c("Score.1","Score.2","Score.3","Score.4")])
# 2. Missing data split by timepoint [does not work]
df %>%
group_by(Timepoint) %>%
gg_miss_var(.[,c("Score.1","Score.2","Score.3","Score.4")]) %>%
ungroup()
Примеры Данных
df <- structure(list(ID = c(1L, 1L, 1L, 2L,
2L, 3L), Timepoint = c("baseline", "year1", "year2",
"baseline", "year1", "baseline"), Score.1 = c(NA, 6, 4, 4, 5, 5), Score.2 = c(11,
10, 8, 8, 8, 9), Score.3 = c(4, NA, 9, 10, 8, 6), Score.4 = c(22,
50, 33, 28, 27, 33)), row.names = c(NA, -6L), class = c("tbl_df",
"tbl", "data.frame"))
Пример Вывода
Ниже приведен результат, полученный для #1 в коде. Мне бы хотелось получить копии приведенного ниже, используя только данные за соответствующий момент времени (т. Е. базовый уровень, год1, год2).
Комментарии:
1. Можете ли вы уточнить, что вы подразумеваете под «разделением»? Если у вас одинаковый номер каждого класса
{baseline, year1, yeare2}
Timepoint , вы можетеpivot_wider
указать этот столбец и получить отдельный столбец для каждого класса. Если вы хотите анализировать каждый класс временных точек отдельно, вы можете создать отдельные наборы данных, используяfilter
. Можете ли вы привести пример того, что вы хотите в конечном итоге сделать?2. Пожалуйста, добавьте используемый пакет, так
gg_miss_var
как, насколько я знаю, это не базовая функция R.3. Как выглядит ваш ожидаемый результат?
Ответ №1:
Вы этого ожидаете?
library(tidyverse)
library(naniar)
df %>% select(-ID) %>%
group_by(Timepoint) %>%
gg_miss_var(facet = Timepoint)
Если только вы не предпочитаете три отдельных участка. Тогда сделайте это:
df %>% select(-ID) %>%
group_by(Timepoint) %>%
group_map(~gg_miss_var(.x) ggtitle(.y))
Это тот эффект, которого вы ожидали?