在R语言中按行计算时间均值(时分分离)
解决方案
步骤说明
- 时间转数值:把
a、b列的时间字符串转换为总分钟数,方便计算均值; - 行均值计算:按行计算两个时间的均值,全NA的行返回NA;
- 拆分小时分钟:将均值的总分钟数拆分为小时和分钟;
- 合并结果:把新生成的小时、分钟列合并到原数据框。
完整代码
# 构建输入数据框 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
相关产品推荐
相关产品推荐

