r - 从大型数据集中制作重复数据的子集
问题描述
我正在尝试使用 R 从大型数据集中提取某些数据。数据来自经历多个阶段的过程,比如说阶段 0 到 5。我有一个数据集,其中包含该过程的多次运行。
我正在尝试提取每次运行的数据。我想创建第一次出现阶段 0 到 5 的子集,然后创建另一个子集,再次出现阶段 0 到 5(第二次运行)。该数据集仅包含按时间顺序排列的过程数据和阶段编号,它不知道它在哪个运行中。但是,阶段是按顺序排列的,因此阶段列从 0 到 5,然后又从 0 开始。
我已经尝试使用一些 while 和 for 循环来组织数据,但是在如此大的数据集(700 000 个条目)上这非常慢。即使使用只有 10000 个左右条目的一小部分也需要很长时间。
数据集可能看起来像这样(第二列是阶段):
01, 0, 2, 4, 5, 3, 4,
02, 0, 3, 4, 5, 2, 2,
03, 0, 4, 5, 4, 9, 8,
04, 1, 8, 9, 2, 7, 3,
05, 1, 8, 7, 0, 7, 8,
06, 2, 8, 4, 9, 7, 8,
07, 2, 9, 7, 5, 0, 8,
08, 2, 8, 6, 5, 7, 9,
07, 2, 8, 7, 6, 7, 9,
08, 3, 7, 8, 6, 7, 9,
09, 3, 7, 9, 8, 7, 8,
10, 4, 5, 6, 7, 4, 3,
11, 4, 6, 7, 5, 6, 4,
12, 5, 6, 4, 3, 2, 2,
13, 0, 6, 3, 3, 2, 5,
14, 0, 5, 6, 3, 2, 2,
15, 1, 5, 2, 1, 4, 4,
请注意,每相的线数不是恒定的。
我希望从上面的例子中得到的子集是:
01, 0, 2, 4, 5, 3, 4,
02, 0, 3, 4, 5, 2, 2,
03, 0, 4, 5, 4, 9, 8,
04, 1, 8, 9, 2, 7, 3,
05, 1, 8, 7, 0, 7, 8,
06, 2, 8, 4, 9, 7, 8,
07, 2, 9, 7, 5, 0, 8,
08, 2, 8, 6, 5, 7, 9,
07, 2, 8, 7, 6, 7, 9,
08, 3, 7, 8, 6, 7, 9,
09, 3, 7, 9, 8, 7, 8,
10, 4, 5, 6, 7, 4, 3,
11, 4, 6, 7, 5, 6, 4,
12, 5, 6, 4, 3, 2, 2,
和
13, 0, 6, 3, 3, 2, 5,
14, 0, 5, 6, 3, 2, 2,
15, 1, 5, 2, 1, 4, 4,
(注意:在原始数据集中,阶段总是在 5 结束)
解决方案
在您的问题中,仅当阶段索引(在第二列中给出)减少时才开始新的子集。因此我们可以结合which
来diff
获得一个阶段结束的行索引。
我们首先可以获得子集开始/结束的行索引,如下所示:
end <- which(diff(data[,2]) < 0)
start <- c(1, end + 1)
end <- c(end, nrow(data))
然后我们可以使用它来制作一个包含子集的列表,如下所示:
subsets <- vector("list", length(start))
for (idx in 1:length(start))
subsets[[idx]] <- data[start[idx]:end[idx],]
请注意,最后一步仍然使用 for 循环。我希望可以实现类似的东西,split
但我没有成功尝试。
编辑:当然 R 有一个避免 for 语句的解决方案。我们应该创建一个新向量,为每一行指示它属于哪个子集。鉴于上述两个向量end
,start
这很容易实现(参见下面的代码片段)。然后我们可以使用内置函数split
并将其输出转换为矩阵列表(受此答案启发)。
# How many rows does each subset has?
n <- end - start + 1
# Create vector that indicates for each row to which subset it belongs
idx_subset <- rep(1:length(start), n)
# Create the subsets
subsets <- lapply( split(data, idx_subset), matrix, ncol=7)
推荐阅读
- spring-boot - 在 activiti bpmn 工作流中使用带有 TimerCatchingEvents 的 ServiceTasks 行为不一致
- kubernetes - Kubernetes集群默认时区?
- android - 使用 sqlite 数据库从随机字符创建单词
- mongodb - 试图调用类“Doctrine\ODM\MongoDB\Aggregation\Builder”的未定义方法“allowDiskUse”
- android - 如何在广播接收器中发出 API 请求?
- azure-devops - 天蓝色管道删除旧的天蓝色 git 分支(不是回购)
- java - 我在 selenium 自动化中创建页面对象模型框架,我面临一个 java 空指针异常
- python - Python中的视差图实现与内置的OpenCV函数不匹配
- c# - 双向绑定的一些问题 - 在 UWP 中无法按预期工作
- node.js - ExpressJS | app.get() 放在 app.use() 定义下方时似乎不起作用