添加行以制作用于纵向数据分析的完整长数据集

Adding rows to make a full long dataset for longitudinal data analysis

我正在处理一个长格式的纵向数据集,其中每个人都有 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,但如果不可能,我只会满足于创建正确的行数。

我们可以在 complete

之后使用 fill
library(dplyr)
library(tidyr)
ExpandedDataset %>% 
      complete(P_ID, Event_code) %>%
      fill(Site_code)

我带来了相当长的代码,但您可以将其分组到一个函数中并使其更容易: 这是您的数据框:

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))

每个 ID 有多少条记录?

values <- summary(df$ID)

单个患者的最大记录数是多少?

target <- max(values)

哪些特定患者的记录少于最大值?

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

对于那些信息缺失的患者,您有多少条记录?

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

现在,让我们创建数据框的向量,我们将添加到您的原始数据框。首先,ID:

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), ]