R 需要更高效的内存过滤日期值向量的方法

R 需要更高效的内存过滤日期值向量的方法,r,datetime,vector,memory-management,filter,R,Datetime,Vector,Memory Management,Filter,总新手到R这里(到目前为止非常高兴!) 我有一个大的日期信息数组(vector?),我想删除不符合我感兴趣的日期范围的行(2003年9月24日至2003年12月10日,每天中午12点至6点)。我好像快没记性了 这是一个我可以说的问题的例子: > head(p_times) [1] "2001-04-11 07:57:27 EDT" "2001-04-11 08:18:11 EDT" [3] "2001-04-11 08:21:33 EDT" "2001-04-11 08:22:52 EDT

总新手到R这里(到目前为止非常高兴!)

我有一个大的日期信息数组(vector?),我想删除不符合我感兴趣的日期范围的行(2003年9月24日至2003年12月10日,每天中午12点至6点)。我好像快没记性了

这是一个我可以说的问题的例子:

> head(p_times)
[1] "2001-04-11 07:57:27 EDT" "2001-04-11 08:18:11 EDT"
[3] "2001-04-11 08:21:33 EDT" "2001-04-11 08:22:52 EDT"
[5] "2001-04-11 08:25:39 EDT" "2001-04-11 08:31:18 EDT"
> length(p_times)
[1] 31164014
> class(p_times)
[1] "POSIXlt" "POSIXt" 
> fp_times = p_times[p_times$year==103]
R(59593,0xa0506540) malloc: *** mmap(size=249315328) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(59593,0xa0506540) malloc: *** mmap(size=124657664) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug
R(59593,0xa0506540) malloc: *** mmap(size=57901056) failed (error code=12)
*** error: can't allocate region
*** set a breakpoint in malloc_error_break to debug

我计划按年度过滤以删除大部分信息,然后使用相同的方法按月/日/小时过滤

您是否可以使用
POSIXct
而不是
POSIXlt
POSIXlt
对象占用的内存似乎是
POSIXct
对象的5倍:

> set.seed(21)
> x <- Sys.time() - trunc(runif(31164014)*3e8); range(x)
[1] "2001-12-03 11:55:25 CST" "2011-06-06 18:15:07 CDT"
> print(object.size(x), units="Mb")
237.8 Mb
> print(object.size(as.POSIXlt(x)), units="Mb")
1188.8 Mb
> 1188.8/237.8
[1] 4.999159
> sessionInfo()
R version 2.13.0 (2011-04-13)
Platform: x86_64-pc-linux-gnu (64-bit)

locale:
 [1] LC_CTYPE=en_US.UTF-8       LC_NUMERIC=C              
 [3] LC_TIME=en_US.UTF-8        LC_COLLATE=en_US.UTF-8    
 [5] LC_MONETARY=C              LC_MESSAGES=en_US.UTF-8   
 [7] LC_PAPER=en_US.UTF-8       LC_NAME=C                 
 [9] LC_ADDRESS=C               LC_TELEPHONE=C            
[11] LC_MEASUREMENT=en_US.UTF-8 LC_IDENTIFICATION=C       

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base
>设置种子(21)
>x打印(对象大小(x),单位=“Mb”)
237.8 Mb
>打印(object.size(as.POSIXlt(x)),单位=“Mb”)
1188.8 Mb
> 1188.8/237.8
[1] 4.999159
>sessionInfo()
R版本2.13.0(2011-04-13)
平台:x86_64-pc-linux-gnu(64位)
区域设置:
[1] LC_CTYPE=en_US.UTF-8 LC_NUMERIC=C
[3] LC_TIME=en_US.UTF-8 LC_COLLATE=en_US.UTF-8
[5] LC_MONETARY=C LC_MESSAGES=en_US.UTF-8
[7] LC_PAPER=en_US.UTF-8 LC_NAME=C
[9] LC_地址=C LC_电话=C
[11] LC_测量=en_US.UTF-8 LC_识别=C
附加基本包:
[1] 统计图形GRUTILS数据集方法库

根据Joshua的回答:
POSIXlt
记录更多信息,以便您可以使用,例如,
$year
<另一方面,code>POSIXct只计算自UNIX时代以来的秒数。因此,
POSIXct
更小,但更不方便。但是,如果计算相关时间,您仍然可以使用此选项进行过滤:

start <- unclass(as.POSIXct("2003-09-24"))-unclass(as.POSIXct("1970-01-01"))
end <- unclass(as.POSIXct("2003-12-11"))-unclass(as.POSIXct("1970-01-01"))

p_times <- as.POSIXct(p_times)
fp_times <- p_times[p_times>start & p_times<end]

开始感兴趣。我不知道我能不能,但我会调查的。我总是可以将它表示为ct,并在索引中将其转换为lt。谢谢!这实际上是我在阅读Joshua的解决方案后使用的解决方案的1/2:pOne hacky的解决方案是(假设输入文件按日期排序,如果不是,则按日期排序),只需找出您想要的起始行和结束行,并在
read.csv()
中使用它们。还有object.size of POSIXlt>POSIXct>as.integer(POSIXlt)嘿,当你写
class(p_次)=“POSIXlt”“POSIXt”
时,“POSIXt”是一个打字错误吗?如果不是的话,这可以解释这种奇怪。