如何将hms对象列表转为单列DataFrame并保留hms格式?
保留hms格式将列表转换为单列DataFrame的高效方法
问题场景
我有一个由hms对象组成的列表(每个列表元素是仅含hms类型列的DataFrame),想要将其转换为单列DataFrame时保留hms格式,但使用unlist配合map_dfr转换后,结果仅显示为秒数形式的数值,丢失了hms格式。
模拟代码
# 生成模拟数据 date_1 <- date() date_ms <- date_1 %>% strsplit(., ' ') %>% unlist() %>% .[4] time_test <- c() for(i in 1:10000){ time_test[[i]] <- data.frame(date = hms(date_ms) - i*2) }
问题重现
执行以下代码后,输出结果为秒数而非预期的hms格式:
map_dfr(time_test, unlist) # A tibble: 10,000 × 1 date <dbl> 1 57 2 55 3 53 4 51 5 49 6 47 7 45 8 43 9 41 10 39 # … with 9,990 more rows
期望输出
date 1 12H 6M 57S 2 12H 6M 55S ... ...
现有方案及局限
使用map_dfr(time_test, pack)可以得到正确格式,但处理大型列表时速度极慢:
map_dfr(time_test, pack) date 1 12H 6M 57S 2 12H 6M 55S 3 12H 6M 53S 4 12H 6M 51S
高效解决方案
推荐两种高效方法,既能保留hms格式,又能快速处理大型列表:
- 直接合并DataFrame
使用dplyr::bind_rows()直接合并列表中的DataFrame,它会自动保留列的hms类型:
library(dplyr) result <- bind_rows(time_test)
- 提取hms向量后转DataFrame
先提取列表中每个元素的hms值组成向量,再转为DataFrame:
# 提取所有hms元素 hms_vector <- sapply(time_test, function(x) x$date) # 转为DataFrame result <- data.frame(date = hms_vector)
内容的提问来源于stack exchange,提问作者Emil11
相关产品推荐
相关产品推荐

