Ame*_*eya 2 performance r data.table
首先,一个可重现的例子。我正在使用 data.table 因为我正在处理大约 2000 万行 -
> require(data.table)
> x <- structure(list(DoM = c(2011241L, 2015359L, 2016352L, 2015360L,
2015287L, 2014038L, 2017066L, 2012227L, 2015041L, 2015295L),
Year = c(2011L, 2015L, 2016L, 2015L, 2015L, 2014L, 2017L,
2012L, 2015L, 2015L), Month = c(8L, 12L, 12L, 12L, 10L, 2L,
3L, 8L, 2L, 10L)), .Names = c("DoM", "Year", "Month"), row.names = c(NA,
-10L), class = c("data.table", "data.frame"))
> x
DoM Year Month
1: 2011241 2011 8
2: 2015359 2015 12
3: 2016352 2016 12
4: 2015360 2015 12
5: 2015287 2015 10
6: 2014038 2014 2
7: 2017066 2017 3
8: 2012227 2012 8
9: 2015041 2015 2
10: 2015295 2015 10
Run Code Online (Sandbox Code Playgroud)
我需要从 DoM 列中提取日期,其中包含类似 Julian 格式的日期。DoM 列的每个元素的形式为yyyyddd,其中ddd是一年中的第几天yyyy(因此是1 <= ddd <= 366)。
例如,第一次约会是2011-08-29因为它对应于241日的日2011
我目前对我所拥有的不满意,那就是——
x[, Date:=as.Date((DoM-1000*Year)-1, origin=paste(Year,1,1,sep='-'))]
Run Code Online (Sandbox Code Playgroud)
我怀疑这paste是低效的,正在寻找任何可能更好的替代方案。
这可以通过基本格式来实现。见?strptime:
as.Date(as.character(x$DoM), format="%Y%j")
# or as @Frank suggests, for integer dates in data.table:
as.IDate(as.character(x$DoM), format="%Y%j")
# [1] "2011-08-29" "2015-12-25" "2016-12-17" "2015-12-26" "2015-10-14"
# [6] "2014-02-07" "2017-03-07" "2012-08-14" "2015-02-10" "2015-10-22"
Run Code Online (Sandbox Code Playgroud)