【发布时间】:2016-03-02 22:00:38
【问题描述】:
我正在尝试将功能嵌套的 for 循环转换为与 apply 一起使用。我希望这会使它更快。 (从我读到的应该是这样,尽管这并不总是正确的)主数据框中有大约 150K 行要循环...非常耗时
我在 R 中编写了一个 for 循环来检查 df1 中的 date.time 是否位于 df2 中的两个 date.time 之间,如果 df1 和 df2 中的代码匹配,则将 df2 中的位置粘贴到 df1 中
以下是子集样本数据
df1<-structure(list(date.time = structure(c(1455922438, 1455922445,
1455922449, 1455922457, 1455922459, 1455922461), class = c("POSIXct",
"POSIXt"), tzone = ""), code = c(32221, 32222, 32221, 32222,
32222, 32221)), .Names = c("date.time", "code"), row.names = 50000:50005, class = "data.frame")
df2<-structure(list(Location = 11:12, Code = 32221:32222, t_in = structure(c(1455699600,
1455699600), class = c("POSIXct", "POSIXt"), tzone = ""), t_out = structure(c(1456401600,
1456401600), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = c("Location",
"Code", "t_in", "t_out"), class = "data.frame", row.names = 11:12)
For 循环可以正常工作,但需要很长时间:
for (i in 1:nrow(df1)[1]){
for (j in 1:nrow(df2)){
ifelse(df1$code[i] == df2$Code[j]
& df1$date.time [i] < df2$t_out [j]
& df1$date.time [i] > df2$t_in [j],
df1$Location [i] <- df2$Location [j],
NA)
}
}
我已经做到了这一点:
ids <- as.numeric(df2$Location)
f <- function(x){
a <- ids[ (df2$t_in < x) & (x < df2$t_out) ]
if (length(a) == 0 ) NA else a
}
df1$Location <- lapply(df1$date.time, f)
这会返回两个数字,因为 df1 中的 date.time 位于 t_in 和 t_out 之间,因此为什么在粘贴位置时需要每个数据帧中的代码匹配
非常感谢任何指针
【问题讨论】:
-
如果您可以提供一个稍微好一点的测试用例,其中一些 i,j 组合不满足 hte 时间条件,那将是理想的。无论如何,请报告 system.time 结果。
-
您可以尝试使用 sqldf 包,看看是否将您的 df 转换为本地数据库,然后对其执行查询有助于您的速度。