※ 引述《jerkoffme (摩德男孩)》之銘言:
: [問題類型]:
: 資料格式轉換
: [軟體熟悉度]:
: 使用者(已經有用R 做過不少作品)
: [問題敘述]:
: 想將 data.table 格式的 table 叫 pop 並將其中一個變量轉換為時間變量,
: 該變量為 char 的格式,但使用日期轉化的函數後最後都會變成數字
: [程式範例]:
: 例如
: post_time
: 2019/8/28 16:43
: 2019/8/28 15:48
: 但我用
: tdf5 <- sapply(pop$post_time, as.POSIXct, format = "%Y/%m/%d %H:%M")
: View(tdf5)
: 結果就會變成
: 1566981780
: 1566978480
: 請問為何會這樣
先回答問題,sapply的simplify造成的
可以看一下source code:
answer <- lapply(X = X, FUN = FUN, ...)
if (!isFALSE(simplify) && length(answer))
simplify2array(answer, higher = (simplify == "array"))
simplify2array(x, higher = TRUE):
unlist(x, recursive = FALSE, use.names = FALSE)
可以看到sapply用了unlist去做simplify
然後unlist不認得POSIXt這個class (因為它丟進C裡,只用最原本的型別: 整數)
而且它沒有再轉換回去,所以你最後sapply看到的就只剩下整數了
那怎麼做?
兩個方式:
1. 根本不需要用sapply,直接用as.POSIXct做就好:
as.POSIXct(DT$post_time)
2. 捨棄sapply改成用lapply + do.call + c取代
do.call(c, lapply(DT$post_time, as.POSIXct))
另外推文說的lubridate也可以,一樣結果:
parse_date_time(DT$post_time, "ymdHM")
或
as_datetime(DT$post_time, format = "%Y/%m/%d %H:%M")
: [環境敘述]:
: R version 3.5.3 (2019-03-11)
: Platform: x86_64-w64-mingw32/x64 (64-bit)
: Running under: Windows >= 8 x64 (build 9200)