这是我的问题。我有一个包含 200k 行的数据集。
- 每行对应于对一个主题进行的测试。
- 受试者的测试次数不等。
- 每个测试都有日期。
我想为每个测试分配一个索引。例如,主题 1 的第一次测试将是 1,主题 1 的第二次测试将是 2。主题 2 的第一次测试将是 1,依此类推。
我的策略是获取唯一主题 ID 的列表,使用 lapply 将数据集子集到使用唯一主题 ID 的数据框列表中,每个主题都有他/她自己的数据框并进行测试。理想情况下,我将能够对每个主题的每个数据框进行排序并为每个测试分配一个索引。
但是,在 200k x 32 数据帧上执行此操作会使我的笔记本电脑(i5、Sandy Bridge、4GB 内存)很快耗尽内存。
我有两个问题:
- 有一个更好的方法吗?
- 如果没有,我克服内存限制的唯一选择是将我唯一的 SubjectID 列表分解为更小的集合,例如每个列表 1000 个 SubjectID,将其应用到数据集中,最后将列表连接在一起。然后,我如何通过提供一个表示分区数的整数来创建一个函数来破坏我的 SubjectID 列表。例如 BreakPartition(Dataset, 5) 将数据集平均分成 5 个分区。
这是生成一些虚拟数据的代码:
UniqueSubjectID <- sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse =""))
UniqueSubjectID <- subset(UniqueSubjectID, !duplicated(UniqueSubjectID))
Dataset <- data.frame(SubID = sample(sapply(1:500, function(i) paste(letters[sample(1:26, 5, replace = TRUE)], collapse ="")),5000, replace = TRUE))
Dates <- sample(c(dates = format(seq(ISOdate(2010,1,1), by='day', length=365), format='%d.%m.%Y')), 5000, replace = TRUE)
Dataset <- cbind(Dataset, Dates)