我正在处理一个长格式的纵向数据集,其中每个人有1、2或3个时间点。为了执行某些分析,我需要确保每个人都有相同数量的行,即使它由NAs组成,因为他们没有完成某个时间点。
这里是添加行之前的数据样本。
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,但是如果不可能的话,我只需要创建正确的行数就可以了。
我们可以使用 fill
在做了 complete
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)]
那么现在,让我们来创建我们将添加到你原来的数据框架的向量。首先,IDs。
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), ]