R语言:将数据框中时间范围字符转为均值,解决强制转换NA问题
解决行程耗时数据的范围均值转换问题
问题根源
- 你的代码错误在于
unlist(str_split(...))会把所有行的拆分结果合并成一个全局向量,mean()计算的是所有行范围的总均值,而非每行单独的范围均值 - 数据中存在带单位(如
minutes/hrs)、文字描述(如half an hour to 40 minutes)的条目,直接转数值会因非数字字符产生NA
完整解决方案
1. 加载依赖包
library(tidyverse)
2. 定义数据处理函数
这个函数会自动提取数字、处理单位转换、计算范围均值:
process_time <- function(time_str) { # 提取字符串中所有数字(支持小数) nums <- str_extract_all(time_str, "\\d+(\\.\\d+)?") %>% unlist() %>% as.numeric() # 处理小时单位:转换为分钟 if (grepl("hour|hr", time_str, ignore.case = TRUE)) { nums <- nums * 60 } # 处理"half an hour"这类特殊表述 if (grepl("half an hour", time_str, ignore.case = TRUE)) { nums <- c(nums, 30) } # 计算结果:范围取均值,单数值直接返回,无有效数字返回NA if (length(nums) >= 1) { mean(nums, na.rm = TRUE) } else { NA_real_ } }
3. 应用到数据框
data <- data %>% mutate(est_time_clean = map_dbl(est_time, process_time))
效果说明
- 范围值如
"30-45"会计算为37.5,"2-4 hours"会转换为分钟后计算均值180 - 带单位的单数值如
"15 Minutes "会提取为15,"30mins"提取为30 - 特殊描述如
"half an hour to 40 minutes"会转换为35 - 无效文本如
"Depends where you live"会返回NA(可根据需求修改函数调整) - 完全避免了
NAs introduced by coercion警告(仅当无有效数字时返回合理NA)
内容的提问来源于stack exchange,提问作者Fionn McGlacken
相关产品推荐
相关产品推荐

