【问题标题】:Adding rows to make a full long dataset for longitudinal data analysis添加行以制作完整的长数据集以进行纵向数据分析
【发布时间】:2020-04-29 17:56:27
【问题描述】:

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

【问题讨论】:

  • 只是我想要这样做的数据框的名称。
  • 如果有办法,我也可以直接使用 csv 文件。
  • 对不起。我看到我试图可视化数据集的尝试失败了——我现在上传了一张关于第一个变量/列的样子的图片。这些是右侧的更多数据,但关键是获取每个参与者的 event_code 并确保每个参与者的所有 3 个事件都有行,即使没有数据存在。
  • 我创建了一个小样本:dput(sample) structure(c(23, 24, 45, 12, 34, 23, 1, 1, 2, 2, 2, 3, 1, 2, 1, 2, 3, 1, 1, 1, 3, 3, 3, 1), .Dim = c(6L, 4L), .Dimnames = list( NULL, c("Values", "P_ID", "Event_code ", "站点代码")))
  • 这行得通吗?

标签: r add rows lme4 longitudinal


【解决方案1】:

我们可以在执行complete 之后使用fill

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-06
      • 1970-01-01
      • 2018-02-07
      相关资源
      最近更新 更多