#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 В ваших новых данных, как должны быть заполнены значения?