我有一个带有日期列的tibble:
df <- structure(list(date = structure(c(1489494191.81966, 1489494125.153,
1489494058.48633, 1489493991.81966, 1489493925.153, 1489493858.48633,
1489493791.81966, 1489493725.153, 1489493658.48633, 1489493591.81966
), class = c("POSIXct", "POSIXt"), tzone = "")), .Names = "date", class = c("tbl_df",
"tbl", "data.frame"), row.names = c(NA, -10L))
df
# A tibble: 10 × 1
date
<dttm>
1 2017-03-14 13:23:11
2 2017-03-14 13:22:05
3 2017-03-14 13:20:58
4 2017-03-14 13:19:51
5 2017-03-14 13:18:45
6 2017-03-14 13:17:38
7 2017-03-14 13:16:31
8 2017-03-14 13:15:25
9 2017-03-14 13:14:18
10 2017-03-14 13:13:11
我想进入列表列中,其中包含零件列表(年,月,日,小时,分钟,秒),类似于:
# A tibble: 10 × 1
result
<list>
1 list(2017,3,14,13,23,11)
2 list(2017,3,14,13,22,5)
3 list(2017,3,14,13,20,58)
4 list(2017,3,14,13,19,51)
5 list(2017,3,14,13,18,45)
6 list(2017,3,14,13,17,38)
7 list(2017,3,14,13,16,31)
8 list(2017,3,14,13,15,25)
9 list(2017,3,14,13,14,18)
10 list(2017,3,14,13,13,11)
我已经尝试了一堆字符串拆分策略,但它们效率很低(实际DF是巨大的)。列表的组件最终需要是整数或数字。
有聪明的方法吗?
编辑:
这是我现在正在做的事情,但似乎并没有很好地扩展:
library(lubridate)
library(purrr)
df %>%
transmute(y = year(date),
m = month(date),
d = day(date),
hh = hour(date),
mm = minute(date),
ss = second(date)
) %>%
by_row(c, .to = "result") %>%
select(result)
# A tibble: 10 × 1
result
<list>
1 <list [6]>
2 <list [6]>
3 <list [6]>
4 <list [6]>
5 <list [6]>
6 <list [6]>
7 <list [6]>
8 <list [6]>
9 <list [6]>
10 <list [6]>
您可以使用library(lubridate)
:
library(lubridate)
y <- year(df$date)
m <- month(df$date)
d <- day(df$date)
h <- hour(df$date)
min <- minute(df$date)
s <- as.integer(second(df$date))
,然后合并到列表中。
res <- lapply(1:length(y), function(x){
return(c(y[x], d[x], d[x], h[x], min[x], s[x]))
})
tibble::tibble(res)
您可以用data.table
的一行代码做到:
DT[, unclass(as.POSIXlt(date))][, .(year+1900, mon, mday, hour, min, sec)]
将您的data.frame
转换为data.table
,并将日期转换为POSIXLT格式。
DT <- as.data.table(df)
DT[, unclass(as.POSIXlt(date))][, ':=' (year=year+1900, mon=mon+1, sec=floor(sec)) ][, .(year, mon, mday, hour, min, sec)]
这将操作链接起来,因此结果看起来像:
year mon mday hour min sec
1: 2017 3 14 7 23 11
2: 2017 3 14 7 22 5
3: 2017 3 14 7 20 58
4: 2017 3 14 7 19 51
5: 2017 3 14 7 18 45
6: 2017 3 14 7 17 38
7: 2017 3 14 7 16 31
8: 2017 3 14 7 15 25
9: 2017 3 14 7 14 18
10: 2017 3 14 7 13 11
这可能是处理数百万记录以您预期的方式分配日期的最快方法。