【问题标题】:Subseting dataframe (long format) based on another dataframe (wide format) in which cases are repeated基于另一个数据帧(宽格式)的子集数据帧(长格式),在这种情况下重复
【发布时间】:2018-06-02 17:59:51
【问题描述】:

我从宽格式的数据框中随机抽取了 100 行(包含 20 行)。我使用了这个 r 代码:

random_100 <- df.wide[sample(nrow(df.wide), 100, replace = T),]

它返回一个包含 100 行的数据框(每行都有患者 ID、治疗结果、治疗联盟),其中患者 ID 可能会重复。这很棒,因为这就是我想要的。

由于我对纵向效应感兴趣,我现在需要从我的长格式数据框中提取相应的行(基于患者 ID)。 我尝试了以下代码:

random_long <- subset(df.long, (df.long$id %in% random_100$id))

但是,我没有接受 100 名患者(*治疗长度),而只有 20 名患者。

我需要使用什么代码来允许从长格式数据帧中抽取患者的频率与从我的宽格式数据帧中随机选择的次数一样多?

我希望我的问题足够清楚。

【问题讨论】:

  • 因为同一个id有重复?
  • 是的,相同的 id 有重复。
  • 这就解释了为什么你只有 20 个 id。
  • 您可能必须加入/合并才能获得 id 的相应信息,即使它是重复的。
  • 是的,但是我怎样才能多次绘制 ids(就像在随机抽样中选择的那样频繁)?

标签: r dataframe subset longitudinal


【解决方案1】:

可能有更优雅的解决方案,但这可能会给你想要的结果

#make up some data
df.wide <- data.frame(id = 1:20, V1 = letters[1:20])

df.long <- data.frame(id = rep(1:20, 50), V2 = paste0("t", 1:1000))

#pull 100 random sampeles
set.seed(3)

random_100 <- df.wide[sample(nrow(df.wide), 100, replace = T),]

#count how many random samples were selected for each patient
x1 <- table(random_100$id)

#pull the corresponding number from df.long
a1 <- lapply(seq_along(x1), function(i) {
  y <- df.long[df.long$id == names(x1)[[i]],]  
  y1 <- y[sample(row.names(y), x1[[i]], replace = T),]
})

#combine
res <- do.call("rbind", a1)  

【讨论】:

    猜你喜欢
    • 2021-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-28
    相关资源
    最近更新 更多