You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 23:15:42