如何按时间戳对不等长R时序数据框的value1列求和?
问题解决:按时间戳匹配相加列值
错误原因
你直接用df1$value1 + df2$value1会报错,核心问题是两个数据框行数不同(df1有8行,df2有5行),且这种写法是按行号硬相加,根本没按时间戳匹配。R发现短向量无法整数倍循环匹配长向量时,判定这是操作失误,所以抛出longer object length is not a multiple of shorter object length错误。
正确解决方案
必须先按timeStamp将两个数据框匹配合并,再计算对应值的和,同时处理未匹配到的情况。
方法1:使用dplyr包(推荐,代码更简洁)
library(dplyr) df_new <- df1 %>% # 按timeStamp左连接,保留df1所有行,匹配df2的对应时间戳行 left_join(df2, by = "timeStamp", suffix = c("_df1", "_df2")) %>% # 计算total:匹配到则相加,未匹配到用0替代df2的空值 mutate(total = value1_df1 + coalesce(value1_df2, 0)) %>% # 保留原df1结构,仅新增total列 select(timeStamp, value1 = value1_df1, total)
方法2:使用base R(无需额外安装包)
# 按timeStamp合并,保留df1所有行 df_merged <- merge(df1, df2, by = "timeStamp", all.x = TRUE) # 将df2中未匹配到的空值替换为0 df_merged$value1.y[is.na(df_merged$value1.y)] <- 0 # 计算总和 df_merged$total <- df_merged$value1.x + df_merged$value1.y # 调整列名和结构,还原df1初始样式 df_new <- df_merged[, c("timeStamp", "value1.x", "total")] names(df_new)[2] <- "value1"
两种方法最终生成的df_new都能满足需求:
- 两个数据框共有的时间戳,
total为对应value1的和 - 仅df1存在的时间戳,
total直接取df1的value1值
内容的提问来源于stack exchange,提问作者ambergris
相关产品推荐
相关产品推荐

