如何避免从tibble提取POSIXct变量存入列表时转为数值型
解决R中提取POSIXct日期存入列表时类型被强制转换的问题
问题原因
R的原子向量(通过c()创建的向量)仅能存储单一类型的数据。当你将整数(visitID/edgeID)与带有POSIXct类属性的日期值组合时,POSIXct的类属性会被剥离,仅保留其底层的数值表示(从1970-01-01开始计算的秒数),导致日期格式丢失。
解决方案
方案1:用列表存储每个元素(保留原始类型)
不要用c()创建原子向量,改用list()构建每个列表项——列表可以容纳不同类型的元素,完美保留日期的POSIXct属性:
edge_list <- vector("list", nrow(b)-1) # 填充第一个列表元素 edge_list[[1]] <- list( visitID = b[[1,1]], edgeID = b[[1,4]], start_time = b[[1,2]], end_time = b[[2,2]] ) # 验证日期类型 edge_list[[1]]$start_time # [1] "2020-04-01 UTC" class(edge_list[[1]]$start_time) # [1] "POSIXct" "POSIXt"
如果需要批量填充所有列表元素,可使用循环:
for (i in 1:(nrow(b)-1)) { edge_list[[i]] <- list( visitID = b$visitID[i], edgeID = b$edgeID[i], start_time = b$entry_date[i], end_time = b$entry_date[i+1] ) }
方案2:直接生成目标数据框(更高效,适配后续追加需求)
如果最终要将列表转为数据框,直接生成tibble并合并是更高效的做法,跳过中间列表步骤:
library(dplyr) library(purrr) edge_df <- map_dfr(1:(nrow(b)-1), function(i) { tibble( visitID = b$visitID[i], edgeID = b$edgeID[i], start_time = b$entry_date[i], end_time = b$entry_date[i+1] ) }) # 查看结果 edge_df # # A tibble: 2 × 4 # visitID edgeID start_time end_time # <int> <int> <dttm> <dttm> # 1 1 1 2020-04-01 00:00:00 2020-04-15 00:00:00 # 2 2 2 2020-04-15 00:00:00 2020-05-01 00:00:00
生成的edge_df直接保留了POSIXct类型,无需后续二次转换。
内容的提问来源于stack exchange,提问作者pandora
相关产品推荐
相关产品推荐

