我正在尝试将适用的嵌套for循环变为使用。我希望这会使它快很多。 (从我读它应该,虽然这并非总是如此)主数据帧中有一些150K行循环...非常耗时如何使嵌套for循环更高效,并与应用一起使用
我已经在R中编写了一个for循环来检查日期。时间在DF1在于DF2 2个date.times之间,并且如果在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组合不满足时间条件,那将是理想的。无论如何,请回报system.time结果。 –
您可以尝试使用sqldf软件包查看是否将df转换为本地数据库,然后在其上执行查询有助于提高速度。 – fhlgood