如何将列表中所有tibble的指定列转换为Time时间值?
问题原因说明
- 无大括号时循环仅修改最后一个表的原因:R的for循环在不写大括号的情况下,仅会执行紧跟循环声明的第一行代码,剩下的3行代码会在循环完全结束后才运行,此时
i的值停留在列表的最大索引,自然只会修改最后一个表。 - 带大括号时报错的原因:大概率是代码换行/缩进不规范导致的语法识别错误,R要求循环体的大括号要么和
for在同一行,要么换行后没有多余的非法字符。
修复方案
方案1:修正for循环写法
把循环体完整包裹在大括号内,保证语法规范即可正常运行:
for(i in seq_along(ErgoWithings_list)) { MyDateTime <- ErgoWithings_list[[i]]$Time MyDateTime <- strptime(MyDateTime, format = "%H:%M:%OS") MyDateTime <- as.POSIXct(as.numeric(as.POSIXct(MyDateTime)) %% 86400, origin = "2021-09-28") ErgoWithings_list[[i]]$Time <- MyDateTime }
方案2:列表迭代更推荐的purrr::map写法
属于tidyverse生态的purrr包专门用于列表操作,代码更简洁不易出现语法错误:
# 未安装依赖包先运行 install.packages(c("purrr", "lubridate")) library(purrr) library(lubridate) ErgoWithings_list <- map(ErgoWithings_list, function(df) { df$Time <- df$Time %>% strptime(format = "%H:%M:%OS") %>% as.POSIXct() %>% as.numeric() %% 86400 %>% as.POSIXct(origin = "2021-09-28") return(df) })
仅保留时间信息的实现
如果不需要日期,仅要时分秒信息,优先推荐用hms包的专用时间类,它本质是数值类型,支持时间差计算,展示时只会显示时分秒:
# 未安装先运行 install.packages("hms") library(hms) # 可以直接替换上面的转换逻辑 ErgoWithings_list <- map(ErgoWithings_list, function(df) { df$Time <- as_hms(strptime(df$Time, format = "%H:%M:%OS")) return(df) })
如果不需要做时间计算,仅用于展示,也可以直接转成字符格式:
df$Time <- format(strptime(df$Time, format = "%H:%M:%OS"), "%H:%M:%OS")
内容的提问来源于stack exchange,提问作者GZM97
相关产品推荐
相关产品推荐

