【问题标题】:How to make a data frame with the same number of rows for each participant如何为每个参与者制作具有相同行数的数据框
【发布时间】:2019-05-07 13:47:44
【问题描述】:

我有一个包含 80 个主题的数据框,每个主题应该有 50 个观察值。然而,由于以前在数据处理中应用了一些排除标准,现在,并不是每个受试者都有 50 个观察值。但是为了应用一些后续的数据分析过程,我需要数据框为 80 * 50。所以,我需要将那些缺失的行加回去,并将它们的值分配为 0。我想知道如何实现这一点。

我用一个简化的情况来说明这一点。 假设数据框有三列:Subj、TimeBin 和 Value。 假设有3个Subjs:S001、S002、S003;并且有 6 个 TimeBins:T0、T1、T2、T3、T4、T5。现在,S001 和 S002 具有所有必要的观测值,但 S003 缺少 T2 和 T5 的观测值。我应该如何弥补这两个缺失的行?

谢谢!

【问题讨论】:

  • 数据框是一个向量列表,其中每个向量必须具有相同的大小。但是,如果您正在处理不是数据框的实际列表,则无需再担心此约束。也许您的问题可以通过列表和一些应用功能更容易解决?
  • tidyr 包中的函数complete() 听起来可能就是您要找的。​​span>
  • 每个主题总是有 6 个时间段吗?如果是,对我来说,这看起来像是填补缺失值问题df[is.na(df)] <- 0
  • 不清楚您是否已经有一个 50x80 的数据框,或者您正在尝试从其他数据中生成它?

标签: r


【解决方案1】:

让我们尝试重现您描述的情况。

这是一个数据框,其中 (S003, T2) 和 (S003, T5) 的 Value 为 NA:

library(dplyr)
library(tidyr)

set.seed(1001) 
df1 <- data.frame(Subj = rep(c("S001", "S002", "S003"), each = 6),
                  TimeBin = rep(c("T0", "T1", "T2", "T3", "T4", "T5"), 3),
                  Value = c(sample(1:50, 18, replace = TRUE))) %>% 
       mutate(Value = ifelse(Subj == "S003" & grepl("T[2|5]", TimeBin), NA, Value))

“以前在数据处理中应用的一些排除标准” - 您没有指定它是什么,但让我们省略具有 NA 值的行:

df1 <- na.omit(df1)

tidyr::complete() 可以处理这个问题,前提是至少有一些主题有完整的行集:

df1 %>% 
  complete(Subj, nesting(TimeBin), fill = list(Value = 0))

如果没有受试者拥有完整的集合,您将不得不在处理过的数据和原始数据之间设计某种连接。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-01
    • 2020-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多