【发布时间】:2019-09-25 12:41:06
【问题描述】:
给定一个非常大的数据集(> 100 万次观察),我正在尝试对我的逻辑进行矢量化,但还没有找到解决它的 R 化方法。
问题是每次我在变量中有“坏”观察时,我都需要检查前 5 次观察中的“好”指标。只要前面有 5 个“好”观察,就会保留“坏”观察。如果在 5 个观察移动窗口内有“坏”的观察,那么该观察最终将从分析中删除。
到目前为止,我已经尝试使用带有 ifelse() 逻辑的 for 循环。逻辑检查出来了,但是使用 R 的处理需要几个小时才能完成。我已经查看了用于滚动窗口的 zoo 包,但没有应用像 mean() 或 sum() 这样的聚合函数。我还研究了apply()、lapply() 等,但无法让它们工作。
这是我的 for 循环代码。让df$Observation 成为Good vs Bad 的初始名称,让df$Result 成为我们是否保留或放弃观察的决定。
编辑
set.seed(1)
df <- data.frame(Observation = sample(c("Good", "Bad"), 1000, T, c(0.9,0.1)))
for(i in 1:nrow(df)){
ifelse(
df$Observation[i] == "Good",
df$Result[i] <- "Keep",
ifelse(
df$Observation[i] == "Bad" &
df$Observation[i-1] == "Good" &
df$Observation[i-2] == "Good" &
df$Observation[i-3] == "Good" &
df$Observation[i-4] == "Good",
df$Result[i] <- "Keep",
df$Result[i] <- "Drop"
)
)
}
期望结果示例:
df[385:393,]
Observation Result
385 Good Keep
386 Good Keep
387 Good Keep
388 Good Keep
389 Good Keep
390 Bad Keep
391 Good Keep
392 Good Keep
393 Bad Drop
代码按预期工作,但我需要一种更有效的方式在 R 中执行它。感谢您的帮助!
【问题讨论】:
标签: r loops vectorization