繁体   English   中英

大数据帧中的循环优化

[英]Optimizing for loop in big data frame

我有一个大数据框(600万行),其中一行用于输入时间,另一行用于退出同一单位(id)的时间。 我需要把它们放在一起。

原始数据如下所示(请注意,某些“ id”可能会两次进入和退出,就像id = 1的情况一样):

df <- read.table(header=T, text='id   time
1  "15/12/2014 06:30"
1   "15/12/2014 06:31"
1 "15/12/2014 06:34"
1 "15/12/2014 06:35"
2  "15/12/2014 06:36"
2  "15/12/2014 06:37"
3 "15/12/2014 06:38"
3 "15/12/2014 06:39"')

我需要的输出:

id  entry   exit
1   15/12/2014 06:30    15/12/2014 06:31
2   15/12/2014 06:34    15/12/2014 06:35
3   15/12/2014 06:36    15/12/2014 06:37
4   15/12/2014 06:38    15/12/2014 06:39

现在,我尝试了一个for循环,该循环从第1行中选择ID和进入时间,从第2行中选择退出时间,并将它们放在一起:

for (i in 1:nrow(df)){
outputdf[i,1] <- df[i+i-1,1]
outputdf[i,2] <- df[i+i-1,2]
outputdf[i,3] <- df[i+i-1+1,2]
}

问题在于它效率很低(适用于1万个子集,但不适用于我的600万个数据帧)。 我至少需要不到一分钟的时间。 我在df有600万行。 您知道比该循环更快的其他匹配行吗?

你可以试试

  library(data.table)
  dcast.data.table(setDT(df)[ ,c('.id', 'Seq'):= 
        list(c('entry', 'exit'), gl(.N,2, .N))], id+Seq~.id, value.var='time')

  #   id Seq            entry             exit
  #1:  1   1 15/12/2014 06:30 15/12/2014 06:31
  #2:  1   2 15/12/2014 06:34 15/12/2014 06:35
  #3:  2   3 15/12/2014 06:36 15/12/2014 06:37
  #4:  3   4 15/12/2014 06:38 15/12/2014 06:39

数据

 df <- structure(list(id = c(1L, 1L, 1L, 1L, 2L, 2L, 3L, 3L), time = 
   structure(1:8, .Label = c("15/12/2014 06:30", 
 "15/12/2014 06:31", "15/12/2014 06:34", "15/12/2014 06:35", "15/12/2014 06:36", 
 "15/12/2014 06:37", "15/12/2014 06:38", "15/12/2014 06:39"), class
   = "factor")),.Names = c("id", "time"), class = "data.frame", row.names
  = c(NA, -8L))

也许我错过了一些东西,但是呢?

indx   <- seq(1,nrow(df)-1,2)
result <- with(df,data.frame(seq=seq(indx),id=id[indx],entry=time[indx],exit=time[indx+1]))
result
#   seq id            entry             exit
# 1   1  1 15/12/2014 06:30 15/12/2014 06:31
# 2   2  1 15/12/2014 06:34 15/12/2014 06:35
# 3   3  2 15/12/2014 06:36 15/12/2014 06:37
# 4   4  3 15/12/2014 06:38 15/12/2014 06:39

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM