【发布时间】:2022-01-14 01:08:28
【问题描述】:
在给定的数据集中,case_control 表示一行是case 还是control,id 是case 唯一的标识符,但对于control 和@987654329 可以重复@ 表示集群。我需要在每个group 中为每个案例选择一个控件,但如果之前为一个案例选择了一个控件,则无法根据id 变量为下一个案例选择它。如果没有可用的控件,则必须放弃该案例。
我怎样才能实现这一点,以便在具有约 1000 万行(包含 200 万个案例和 800 万个控件)的非常大的数据集中快速工作?
数据集长这样(https://docs.google.com/spreadsheets/d/1MpjKv9Fm_Hagb11h_dqtDX4hV7G7sZrt/edit#gid=1801722229)
group case_control id
cluster_1 case 11
cluster_1 control 21
cluster_1 control 22
cluster_1 control 23
cluster_2 case 12
cluster_2 control 21
cluster_2 control 22
cluster_2 control 24
cluster_3 case 13
cluster_3 control 21
cluster_3 control 22
cluster_3 control 25
预期的输出必须如下所示
group case_control id
cluster_1 case 11
cluster_1 control 21
cluster_2 case 12
cluster_2 control 22
cluster_3 case 13
cluster_3 control 25
【问题讨论】:
-
每个病例的对照观察是否总是相同数量?
-
嗨@DonaldSeinen,不,每个集群中控件的数量可能会有所不同。
-
既然速度很重要(这是一个重复的任务吗?)你介意改变结构以适应任务吗?示例 - 整数矩阵(组 1:n,对于 case_control 为 1/0 的布尔值)可能会加速此处的任何子集操作。
-
@DonaldSeinen,是的,我能做到。拥有这些变量类型真的有那么大吗?
-
lapply vs for 当相同的函数应用于更大的数据集时,这是一种避免性能问题的方法,如下面的@wimpel 的回答。特别是如果一种方法复制数据。对于您的样本数据,转换为整数矩阵将占用约 7 倍的内存空间。此外,还有许多针对矩阵操作进行了优化的包,它们可能比其他解决方案更快,因为它们可以避免类型检查,例如
Rfast。
标签: r select data.table