Добавление строк для создания полного длинного набора данных для продольного анализа данных - PullRequest
1 голос
/ 29 апреля 2020

Я работаю с длинным форматом продольного набора данных, где у каждого человека есть 1, 2 или 3 временные точки. Чтобы выполнить определенный анализ, мне нужно убедиться, что у каждого человека одинаковое количество строк, даже если оно состоит из NA, потому что они не завершили определенный момент времени.

Вот пример данных перед добавление строк:

structure(list(Values = c(23, 24, 45, 12, 34, 23), P_ID = c(1, 
1, 2, 2, 2, 3), Event_code = c(1, 2, 1, 2, 3, 1), Site_code = c(1, 
1, 3, 3, 3, 1)), class = "data.frame", row.names = c(NA, -6L))


This is the data I aim to get after adding the relevant rows:


structure(list(Values = c(23, 24, NA, 45, 12, 34, 23, NA, NA), 
P_ID = c(1, 1, 1, 2, 2, 2, 3, 3, 3), Event_code = c(1, 2, 
3, 1, 2, 3, 1, 2, 3), Site_code = c(1, 1, 1, 3, 3, 3, 1, 
1, 1)), class = "data.frame", row.names = c(NA, -9L))

Я хочу придумать код, который автоматически добавлял бы строки в набор данных при условии, что у участника было 1, 2 или 3 посещения. В идеале, при копировании Participant_ID и site_code оставшиеся данные должны быть всеми NA, но если это невозможно, я бы остался доволен созданием нужного количества строк.

Ответы [ 2 ]

0 голосов
/ 29 апреля 2020

Я пришел с довольно длинным кодом, но вы могли бы сгруппировать его в функцию и упростить: Вот ваш фрейм данных:

df <- data.frame(ID = c(rep("P1", 2), rep("P2", 3), "P3"),
                 Event = c("baseline", "visit 2", "baseline", "visit 2", "visit 3", "baseline"),
                 Event_code = c(1, 2, 1, 2, 3, 1),
                 Site_code = c(1, 1, 2, 2, 2, 1))

Сколько записей у вас на один идентификатор?

values <- summary(df$ID)

Какое максимальное количество записей для одного пациента?

target <- max(values)

Какие конкретно c пациентов имеют меньше записей, чем максимальное?

uncompliant <- names(which(values<target))

И сколько У вас есть записи для тех пациентов, у которых отсутствует информация?

rowcount <- values[which(values<target)]

Итак, давайте теперь создадим векторы фрейма данных, которые мы добавим к вашему исходному. Сначала идентификаторы:

IDs <- vector()
for(i in 1:length(rowcount)){
  y <- rep(uncompliant[i], target - rowcount[i])
  IDs <- c(IDs, y)
}

А теперь, коды сайтов:

SC <- vector()
for(i in 1:length(rowcount)){
  y <- rep(unique(df$Site_code[which(df$ID == uncompliant[i])]), target - rowcount[i])
  SC <- c(SC, y)
}

Наконец, фрейм данных со значениями, которые мы введем:

introduce <- data.frame(ID = IDs, Event = rep(NA, length(IDs)),
                        Event_code = rep(NA, length(IDs)),
                        Site_code = SC)

Объединить исходный фрейм данных с новыми значениями, которые нужно добавить, и отсортируйте их так, чтобы они выглядели хорошо:

final <- as.data.frame(rbind(df, introduce))
final <- final[order(v$ID), ]
0 голосов
/ 29 апреля 2020

Мы могли бы использовать fill после выполнения complete

library(dplyr)
library(tidyr)
ExpandedDataset %>% 
      complete(P_ID, Event_code) %>%
      fill(Site_code)
...