如何使用 data.table/dplyr 在两个层次结构中进行高效采样和替换?

2023-12-25

我正在尝试使用 data.table/tidyverse 在两个级别上进行有效采样:

1 级是医院 ID(hospital_id )
2 级是医生 ID(doctor_id )

我需要首先从 $N$ 总额中对替换 $N$ 医院进行抽样。 然后我需要从 $M_i$ 总数中抽取为 $i$ 医院工作的替代 $M_i$ 医生进行抽样。

现在,我按如下方式进行操作:我对具有替换的唯一医院 ID 的数据框进行采样。然后我和医生一起去他们工作的医院。然后我由医院集团进行替换采样。

但这会导致连接速度缓慢。有没有一种方法可以更有效地做到这一点?这是我的 data.table 实现,但很乐意以任何方式执行此操作。

# We have a data.frame with one row for every hospital
unique_hospitals_df <- unique(hospital_df[, c("hospital_id")])

# We sample hospitals with replacement at level 1
r_sampled_hospital_ids <- unique_hospitals_df[sample(nrow(unique_hospitals_df),
                      floor(length(unique_hospitals_df) * sample_frac), replace=T), ]

# Now that we have the resampled ID's, we join to the doctors data.frame at level 2
r_df_full <- r_sampled_hospital_ids[,c("hospital_id", "doctor_id")][DT, on = c("hospital_id", "doctor_id"), nomatch = NULL, allow.cartesian = T]

# Now we resample the doctors within each hospital with replacement (level 2)
r_DT_resampled <- r_df_full[, .SD[sample(.N, .N, replace=T)], keyby = hospital_id]

更新:Mnist 要求进一步解释。

dt <- data.table(HOSP = rep(LETTERS[1:5], 1:5),                  DOC = letters[15:1],                  value = 1:15)

这给了我们这些数据:

   HOSP DOC value
 1:    A   o     1
 2:    B   n     2
 3:    B   m     3
 4:    C   l     4
 5:    C   k     5
 6:    C   j     6
 7:    D   i     7
 8:    D   h     8
 9:    D   g     9
10:    D   f    10
11:    E   e    11
12:    E   d    12
13:    E   c    13
14:    E   b    14
15:    E   a    15

所以我们有两个步骤。

  1. 我们从 HOSP 中 SWR N 次(其中 N 是数据集中的项目数)。所以我们会得到长度为 15 的 A、B、C、D、E 的混合。
  2. 我们对每个 HOSP ID 内的每组 DOC 进行 SWR M 次(其中 M 是医院中 doc 的数量)。因此对于 B,我们将 SWR n 和 m 乘以 2 倍。对于 Hosp C,我们将 SWR l,k,j 3 次等等。
  3. 行中的所有其他列最终都应包含在 SWR 操作中。

我希望我理解您想要的结果,但在这里我们首先对医院进行抽样,set.seed(1)我们得到 4xA、4xB 等(参见mn)。然后我们根据这些抽签对医生进行抽样。这意味着我们会得到 4 名医生 o,因为该医院只有一名医生可供采样。对于E医院,我们抽了3次,但由于您的要求是带替换的样品,所以我们碰巧抽到了b医生一次,e医生抽了两次,而其他可用的医生没有抽中。

dt <- data.table(
  HOSP = rep(LETTERS[1:5], 1:5),
  DOC = letters[15:1],
  value = 1:15
)

set.seed(1)

# sample your hospitals and get the counts
mn <- table(sample(unique(dt$HOSP), nrow(dt), replace = TRUE))

# mn
# A B C D E 
# 4 4 3 1 3

# get your doctor sample based on the hospital samples in mn
samples <- data.table(stack(sapply(names(mn), FUN = \(x) dt[HOSP == x, sample(unlist(.SD), mn[x], replace = TRUE), .SDcols = "DOC"])))
setnames(samples, new = c("DOC", "HOSP"))

# join to get the values
samples[dt, on = c("HOSP", "DOC"), nomatch = 0]

#     DOC HOSP value
# 1:    o    A     1
# 2:    o    A     1
# 3:    o    A     1
# 4:    o    A     1
# 5:    n    B     2
# 6:    m    B     3
# 7:    m    B     3
# 8:    m    B     3
# 9:    l    C     4
# 10:   k    C     5
# 11:   j    C     6
# 12:   h    D     8
# 13:   e    E    11
# 14:   e    E    11
# 15:   b    E    14
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 data.table/dplyr 在两个层次结构中进行高效采样和替换? 的相关文章

  • 在 OS X 10.7.4 上安装 RSRuby 时找不到库

    我正在尝试在我的 Mac 上安装 RSRuby 调用后 sudo gem install rsruby 我收到此错误 ERROR Cannot find the R library aborting extconf rb failed Co
  • 解释R中模型多重共线性的别名表测试

    有人可以帮助我解释别名函数输出 以测试多元回归模型中的多重共线性 我知道我的模型中的一些预测变量是高度相关的 我想使用别名表来识别它们 Model Score Comments Pros Cons Advice Response Value
  • 在批处理模式下运行 R - 打印到屏幕?

    跑步时 R CMD BATCH options filename r 我想控制输出的打印位置 我可以使用以下命令抑制 Rout 文件的创建 R CMD BATCH options filename r dev null 但是否可以将输出直接
  • 相当于 Rcpp 中的 'which' 函数

    我是 C 和 Rcpp 的新手 假设我有一个向量 t1 lt c 1 2 NA NA 3 4 1 NA 5 我想获得 t1 的元素索引NA 我可以写 NumericVector retIdxNA NumericVector x Step 1
  • 大数据集每两列的平均值

    如下所示 我有一个大型数据集 其中按列组织了 12 小时的温度 我希望取每日平均值 即一次平均两列 直到数据集结束 有人可以指出我一个简单解决方案的方向吗 我知道这可能非常简单 但我找不到任何现有的解决方案 01 01 2000 00 00
  • 如何绘制两个 ggplot 密度分布之间的差异?

    我想使用 ggplot2 来说明两个相似密度分布之间的差异 这是我拥有的数据类型的玩具示例 library ggplot2 Make toy data n sp lt 100000 n dup lt 50000 D lt data fram
  • R 忽略空值的矩阵列的成对比较

    我有一个数组 我想获取它之间的相似度的度量values在每一列中 我的意思是我希望比较数组的成对列之间的行 并在它们的值匹配时增加一个度量 对于两列来说 所得的测量值最大值将完全相同 本质上我的问题与这里讨论的相同 R 两两比较矩阵中的所有
  • 如何在 R 中抓取受保护的页面(https 链接)(使用 XML 包中的 readHTMLTable)?

    关于如何使用 XML 包中的 readHTMLTable 有很好的答案 我使用常规 http 页面做到了这一点 但是我无法解决 https 页面的问题 我正在尝试阅读该网站上的表格 网址字符串 library RTidyHTML libra
  • 循环更改多个数据帧

    例如 我有这三个数据集 就我而言 它们更多并且有很多变量 data frame1 lt data frame a c 1 5 3 3 2 b c 3 6 1 5 5 c c 4 4 1 9 2 data frame2 lt data fra
  • Leaflet Map - 第二个多边形使第一层不可点击

    我正在制作美国社区调查数据地图 目前我有一个主要层 如下所示plotMerge incomePerCapita 它运作良好 有一个完全充实的弹出窗口 图像等等 当我添加第二层以提供县和地区边界时 区域边界变得不可单击 似乎被新层掩盖了 如果
  • 通过变量分割 data.frame [重复]

    这个问题在这里已经有答案了 我将多个主题的数据存储在一个 CSV 文件中 导入 CSV 文件后 我想将每个参与者的数据拆分到自己的 data frame 中 更确切地说 我想采用下面的示例数据 并创建三个新的 data frames 每个
  • 列表列中的设置操作

    我正在尝试做集合运算在存储在列表列中的向量之间 例如this https stackoverflow com questions 38712196 text file to dataframe with a list column DT l
  • 两组点之间的距离[重复]

    这个问题在这里已经有答案了 因此 在查看了 stackoverflow 上提出的各种问题后 我仍然无法理解 R 中的 dist 函数 甚至无法理解一般的距离矩阵 所以我有两个带有 xy 坐标的数据框 df1 lt data frame x
  • 如何找到每个分类变量的连续变量的平均值

    我想在 y 轴上绘制连续的 BMI 在 x 轴上绘制家庭收入的分类变量 并且我希望该图绘制每个类别的平均 BMI 然而 我不知道如何找到家庭收入每个因素的平均体重指数 Dataset nh 5994 total IDs with Obser
  • 如何将美国人口普查局的州级形状文件合并为全国性形状

    人口普查局不提供全国范围内公共使用微数据区域的形状文件 美国社区调查中可用的最小地理区域 我尝试用几种不同的方法将它们结合起来 但即使是消除重复标识符的方法一旦到达加利福尼亚州也会崩溃 我是在做一些愚蠢的事情还是需要一个困难的解决方法 下面
  • 与 data.table 合并时防止重复列

    我有两个数据表 它们的列名部分相似 dfA lt read table text A B C D E F G iso year matchcode 1 0 1 1 1 0 1 0 NLD 2010 NLD2010 2 1 0 0 0 1 0
  • 尝试通过列表递归时,在 R 中出现错误“递归索引在级别 2 失败”

    当我尝试递归遍历图形顶点列表 将它们的值与列表中的一组颜色进行匹配时 出现错误 递归索引在级别 2 失败 我的颜色列表如下 colrs lt list l blue c red n gray50 然后我有一个 igraph 中的顶点列表vs
  • R:使用 RGDAL 和 RASTER 包时抛出错误

    给所有可能相关的人 这是源代码 GRA D1 lt raster files 1 Sets up an empty output raster GRA D1 lt writeStart GRA D1 filename GRA D1 tif
  • R 语言 - 等待用户使用 scan 或 readline 输入

    我试图让用户输入一些关键字进行查询 在我的脚本中我使用了 scan 或 readline 我使用 R 嵌入脚本编辑器 Windows 进行了尝试 但是当我执行代码时 它使用我的下一行脚本作为标准输入 这是我的 部分 脚本 keywords
  • 更改 ggplot 条形图填充颜色

    有了这个数据 df lt data frame value c 20 50 90 group c 1 2 3 我可以得到一个条形图 df gt ggplot aes x group y value fill value geom col c

随机推荐