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

在R语言中按行计算时间均值(时分分离)

解决方案

步骤说明

  1. 时间转数值:把a、b列的时间字符串转换为总分钟数,方便计算均值;
  2. 行均值计算:按行计算两个时间的均值,全NA的行返回NA;
  3. 拆分小时分钟:将均值的总分钟数拆分为小时和分钟;
  4. 合并结果:把新生成的小时、分钟列合并到原数据框。

完整代码

# 构建输入数据框
a <- c('03:10', '03:10', '03:20')
b <- c('03:20', '03:20', '03:40')
c <- c('A', 'B', 'C')
df <- data.frame(a, b, c, stringsAsFactors = FALSE)

# 定义函数:将时间字符串转换为总分钟数
time_to_mins <- function(time_str) {
  if (is.na(time_str)) return(NA)
  parts <- strsplit(time_str, ":")[[1]]
  as.integer(parts[1])*60 + as.integer(parts[2])
}

# 将a、b列转换为分钟数
df$a_mins <- sapply(df$a, time_to_mins)
df$b_mins <- sapply(df$b, time_to_mins)

# 计算行均值(总分钟数)
df$mean_mins <- rowMeans(df[, c("a_mins", "b_mins")], na.rm = FALSE)

# 定义函数:将总分钟数拆分为小时和分钟
mins_to_time_parts <- function(total_mins) {
  if (is.na(total_mins)) return(list(hour = NA, minute = NA))
  hour <- floor(total_mins / 60)
  minute <- total_mins %% 60
  list(hour = hour, minute = minute)
}

# 拆分均值为小时和分钟
time_parts <- lapply(df$mean_mins, mins_to_time_parts)
df$d <- sapply(time_parts, function(x) x$hour)
df$e <- sapply(time_parts, function(x) x$minute)

# 移除中间列,保留目标列(可选)
df <- df[, c("a", "b", "c", "d", "e")]

# 查看结果
print(df)

输出结果

运行上述代码后,得到的结果如下:

a      b c  d  e
1 03:10 03:20 A  3 15
2 03:10 03:20 B  3 15
3 03:20 03:40 C  3 30

如果需要匹配示例中第一行a、b为NA的情况,只需修改输入数据框的构建代码:

a <- c(NA, '03:10', '03:20')
b <- c(NA, '03:20', '03:40')
c <- c('A', 'B', 'C')
df <- data.frame(a, b, c, stringsAsFactors = FALSE)

此时输出结果为:

a      b c  d  e
1  <NA>  <NA> A NA NA
2 03:10 03:20 B  3 15
3 03:20 03:40 C  3 30

关键细节

  • 用stringsAsFactors = FALSE避免字符串自动转为因子,方便后续处理;
  • rowMeans的na.rm = FALSE确保全NA行的均值返回NA;
  • 自定义函数实现时间与分钟数的双向转换,逻辑清晰易维护。

内容的提问来源于stack exchange,提问作者Blue

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 10:15:10