如何在R语言数据框中添加基于多行列信息的travel_time列?
解决方法
你循环赋值时犯了核心逻辑错误——你的Trav_time函数返回的是整个数据集的计算结果(46955行),但你试图把这整个向量赋值给单独一行,导致了行数不匹配的报错。完全没必要用循环,R的核心优势是向量化运算,直接对整列计算效率更高、代码更简洁。
先明确计算逻辑
假设你要的travel_time是「当前行与上一行的时间差」加上「当前行与上一行的偏差差」,即:travel_time[i] = (time[i] - time[i-1]) + (deviation[i] - deviation[i-1])
第一行无前置行,结果设为NA或0。
方案1:Base R 向量化实现
假设时间列是第5列,偏差列是第6列,直接用向量差计算整列结果:
# 直接添加并赋值列,无需提前创建空列 Bus78_uniM$travel_time <- NA_real_ # 从第2行开始计算相邻行的差值和 Bus78_uniM$travel_time[-1] <- (Bus78_uniM[-1,5] - Bus78_uniM[-nrow(Bus78_uniM),5]) + (Bus78_uniM[-1,6] - Bus78_uniM[-nrow(Bus78_uniM),6])
Bus78_uniM[-1,5]:去掉第一行的时间列Bus78_uniM[-nrow(Bus78_uniM),5]:去掉最后一行的时间列- 两者相减得到所有相邻行的时间差,偏差差同理,相加后直接赋值给
travel_time的第2到最后一行。
方案2:dplyr 简洁实现
用dplyr的lag()函数直接获取上一行的值,代码可读性更强:
library(dplyr) Bus78_uniM <- Bus78_uniM %>% mutate( # 合并计算,无需中间列 travel_time = (.data[[5]] - lag(.data[[5]])) + (.data[[6]] - lag(.data[[6]])) )
.data[[5]]指代数据框的第5列,你也可以直接写列名(比如time)更直观;lag()默认取上一行的值,第一行的lag结果为NA,因此travel_time第一行自动为NA,符合逻辑。
若需保留Trav_time函数
如果你的Trav_time包含特殊计算逻辑,可将其改为向量化函数,直接生成整列结果:
# 修改为向量化函数 Trav_time <- function(data, time_col, dev_col) { time_diff <- data[[time_col]] - lag(data[[time_col]]) dev_diff <- data[[dev_col]] - lag(data[[dev_col]]) return(time_diff + dev_diff) } # 直接调用生成列 Bus78_uniM$travel_time <- Trav_time(Bus78_uniM, 5, 6)
这种方式无需循环,直接返回与数据集行数匹配的结果,彻底避免行数不匹配的错误。
内容的提问来源于stack exchange,提问作者nickijrm
相关产品推荐
相关产品推荐

