2017-03-14 9 views
0

の列をリストします。私は部品のリスト(年、月、日、時間とともにリスト列に中tranformたい日時の欄には、私は日付の列と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が巨大である)非常に非効率的です。リストのコンポーネントは、最後に整数または数値である必要があります。

賢い方法がありますか?

EDIT:

は、これは私が今やっていることですが、そのうまくスケールしていないよう:

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]> 
+1

私は 'df $ res < - strsplit(as.character(df $ date)、" | - |: ")'が始まる可能性があると思います –

答えて

0

あなたは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) 
0

あなたはdata.tableように1行のコードでそれを行うことができます。

DT[, unclass(as.POSIXlt(date))][, .(year+1900, mon, mday, hour, min, sec)]

はあなたのdata.framedata.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 

これはおそらく、あなたが意図した方法で日付を分割する数百万のレコードを処理するために、Rで最速の方法です。

関連する問題