【发布时间】:2011-12-17 10:03:41
【问题描述】:
我编写了一些代码来组织以不同频率采样的数据,但我大量使用了 for 循环,当数据集很大时,这会显着降低代码的运行速度。我一直在检查我的代码,想方设法去除 for 循环以加快它的速度,但其中一个循环让我很困惑。
举个例子,假设数据以 3Hz 的频率进行采样,所以我每秒得到三行数据。但是,变量 A、B 和 C 的采样频率分别为 1Hz,因此我将每三行得到一个值。变量在一秒内连续采样,导致数据呈对角线性质。
更复杂的是,有时原始数据集中会丢失一行。
我的目标是:在确定了我希望保留的行之后,我想将非 NA 值从后续行向上移动到保持行中。如果不是因为丢失数据的问题,我会始终保留包含第一个变量值的行,但如果其中一行丢失,我将保留下一行。
在下面的例子中,第六个样本和第十个样本都丢失了。
A <- c(1, NA, NA, 4, NA, 7, NA, NA, NA, NA)
B <- c(NA, 2, NA, NA, 5, NA, 8, NA, 11, NA)
C <- c(NA, NA, 3, NA, NA, NA, NA, 9, NA, 12)
test_df <- data.frame(A = A, B = B, C = C)
test_df
A B C
1 1 NA NA
2 NA 2 NA
3 NA NA 3
4 4 NA NA
5 NA 5 NA
6 7 NA NA
7 NA 8 NA
8 NA NA 9
9 NA 11 NA
10 NA NA 12
keep_rows <- c(1, 4, 6, 9)
将值向上移动到保持器行后,我将删除中间行,结果如下:
test_df <- test_df[keep_rows, ]
test_df
A B C
1 1 2 3
2 4 5 NA
3 7 8 9
4 NA 11 12
最后,我只希望每一秒的数据只有一行,NA 值应该只保留在丢失一行原始数据的地方。
有没有人知道如何在不使用 for 循环的情况下向上移动数据?我会很感激任何帮助!对不起,如果这个问题太罗嗦了;我宁愿选择信息过多而不是信息不足。
【问题讨论】:
-
澄清:是否可以丢失两个或多个连续行?例如,如果您没有删除 6 和 10,而是删除了 4、5 和 6,那么您将如何检测到发生了这种情况?
-
是的,可能会丢失多个连续的行。在我的代码中的其他地方考虑到这一点后,我已经确定要保留哪些行,我最终会得到类似于我在示例中给出的“rows_to_keep”变量的东西,它是由代码生成的,而不是用户定义的。我不确定这是否会导致给出的解决方案出现问题,因为“rows_to_keep”变量没有实现。
标签: performance r for-loop dataframe