Заполнение пропущенных значений с одного момента времени (среднего) до более ранних и более поздних

#r

#r

Вопрос:

 id <- rep(seq(1, 5, by=1), 4)
code <- rep(c(NA, "abcd11", NA, NA), each=5)
time <- rep(c("baseline", "screening", "3M", "6M"), each=5)

my.df <- data.frame(id, code, time)

my.df <- my.df %>% 
  arrange(my.df$id)
  

У меня есть набор данных, который выглядит аналогично приведенному выше примеру, где у каждого участника есть связанный идентификатор, а также код (категориальная переменная с буквами и цифрами).

Однако код отображается только в один конкретный момент времени (экранирование).

Кроме того, у некоторых участников разное количество временных точек, потому что они выбыли.

Я хотел бы повторить код участников во всех временных точках.

Ответ №1:

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

 my.df <- transform(my.df, code=ave(code, id, FUN=function(x)
  rep(unique(na.omit(x)), length(x))))
my.df
#    id                     time     code
# 1   3           baseline_arm_1 1bmbf816
# 2   3                log_arm_1 1bmbf816
# 3   3        prebaseline_arm_1 1bmbf816
# 4   3          screening_arm_1 1bmbf816
# 5   3 v2a_follow_up__tel_arm_1 1bmbf816
# 6   3 v2b_follow_up__pro_arm_1 1bmbf816
# 7   3  v2c_follow_up__wb_arm_1 1bmbf816
# 8   3 v3a_follow_up__tel_arm_1 1bmbf816
# 9   3 v4a_follow_up__tel_arm_1 1bmbf816
# 10  3 v5a_follow_up__tel_arm_1 1bmbf816
# 11  3  v5c_follow_up__wb_arm_1 1bmbf816
# 12  4           baseline_arm_1 1jqrc869
# 13  4                log_arm_1 1jqrc869
# 14  4        prebaseline_arm_1 1jqrc869
# 15  4          screening_arm_1 1jqrc869
# 16  4 v2a_follow_up__tel_arm_1 1jqrc869
# 17  4 v2b_follow_up__pro_arm_1 1jqrc869
# 18  7           baseline_arm_1 1wxyz123
# 19  7                log_arm_1 1wxyz123
# 20  7        prebaseline_arm_1 1wxyz123
# 21  7          screening_arm_1 1wxyz123
  

Данные:

 my.df <- structure(list(id = c(3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 
3L, 4L, 4L, 4L, 4L, 4L, 4L, 7L, 7L, 7L, 7L), time = c("baseline_arm_1", 
"log_arm_1", "prebaseline_arm_1", "screening_arm_1", "v2a_follow_up__tel_arm_1", 
"v2b_follow_up__pro_arm_1", "v2c_follow_up__wb_arm_1", "v3a_follow_up__tel_arm_1", 
"v4a_follow_up__tel_arm_1", "v5a_follow_up__tel_arm_1", "v5c_follow_up__wb_arm_1", 
"baseline_arm_1", "log_arm_1", "prebaseline_arm_1", "screening_arm_1", 
"v2a_follow_up__tel_arm_1", "v2b_follow_up__pro_arm_1", "baseline_arm_1", 
"log_arm_1", "prebaseline_arm_1", "screening_arm_1"), code = c(NA, 
NA, NA, "1bmbf816", NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, "1jqrc869", 
NA, NA, NA, NA, NA, "1wxyz123")), row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", 
"16", "17", "18", "19", "20", "21"), class = "data.frame")
  

Ответ №2:

Попробуйте этот tidyverse подход, используя fill() :

 library(tidyverse)
#Data
id<-rep(seq(1,5, by = 1),4)
code <- rep(c(NA,"abcd11", NA, NA),each = 5)
time<-rep(c("baseline","screening", "3M", "6M"),each = 5)
my.df<-data.frame(id, code, time,stringsAsFactors = F)
#Fill
my.df <- my.df %>% fill(code,.direction = 'downup')
  

Вывод:

    id   code      time
1   1 abcd11  baseline
2   2 abcd11  baseline
3   3 abcd11  baseline
4   4 abcd11  baseline
5   5 abcd11  baseline
6   1 abcd11 screening
7   2 abcd11 screening
8   3 abcd11 screening
9   4 abcd11 screening
10  5 abcd11 screening
11  1 abcd11        3M
12  2 abcd11        3M
13  3 abcd11        3M
14  4 abcd11        3M
15  5 abcd11        3M
16  1 abcd11        6M
17  2 abcd11        6M
18  3 abcd11        6M
19  4 abcd11        6M
20  5 abcd11        6M
  

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

1. Спасибо! К сожалению, он работает некорректно в реальном наборе данных. Код, например, участника 3 заполняется участником 4 в последние моменты времени. Я предполагаю, что это может быть связано с тем фактом, что у каждого участника разное количество временных точек?

2. @snetlogo Попробуйте добавить образец ваших реальных данных, чтобы правильно понять проблему! Вы можете использовать dput() для этого действие и вставить вывод в вопрос!

3. @snetlogo Попробуйте добавить group_by() оператор для каждого идентификатора, без реальных данных я не могу предоставить правильное решение!

4. Хорошо, спасибо! Я использовал group_by(идентификатор) в реальном наборе данных, а затем снова использовал dput (изменен выше)

5. @snetlogo В ваших новых данных, как должны быть заполнены значения?