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

在R中无分组变量时对相邻两行数据求均值的实现方法

解决R语言中相邻行多列均值计算及区间生成问题

问题分析

你之前的代码核心问题是在原4行数据框上反复修改列,每次ifelse会将非目标行的值设为NA,后续的mutate又会覆盖之前的有效结果;同时原数据行数和目标结果行数(3行)不匹配,导致逻辑混乱。正确的思路应该是直接生成包含相邻行配对的新数据框,而非修改原数据。

可行实现方法

方法一:用dplyr的lead()函数快速实现

利用lead()获取下一行的月份,构造区间后逐行计算相邻均值:

library(dplyr)

# 加载原数据
df <- read.table(text = "Month, var1, var2 
Apr, 5, 3 
Jun, 7, 2 
Aug, 3, 6 
Oct, 10, 4", header = TRUE, sep = ",")

# 生成目标数据集
output <- df %>%
  # 获取下一行的月份,用于构造区间
  mutate(Next_Month = lead(Month)) %>%
  # 过滤掉最后一行(无后续月份可配对)
  filter(!is.na(Next_Month)) %>%
  # 拼接时间区间
  mutate(Duration = paste(Month, Next_Month, sep = "-")) %>%
  # 按行计算相邻两行的均值
  rowwise() %>%
  mutate(
    var1 = mean(c(var1, df$var1[row_number() + 1])),
    var2 = mean(c(var2, df$var2[row_number() + 1]))
  ) %>%
  ungroup() %>%
  # 保留需要的列
  select(Duration, var1, var2)

print(output)

方法二:通过索引配对批量计算(效率更高)

如果数据量较大,可直接生成相邻行的索引对,批量计算均值:

library(tibble)

df <- read.table(text = "Month, var1, var2 
Apr, 5, 3 
Jun, 7, 2 
Aug, 3, 6 
Oct, 10, 4", header = TRUE, sep = ",")

# 生成相邻行的索引组合(如c(1,2), c(2,3), c(3,4))
index_pairs <- lapply(1:(nrow(df)-1), function(i) c(i, i+1))

# 构造结果数据集
output <- tibble(
  Duration = sapply(index_pairs, function(pair) paste(df$Month[pair], collapse = "-")),
  var1 = sapply(index_pairs, function(pair) mean(df$var1[pair])),
  var2 = sapply(index_pairs, function(pair) mean(df$var2[pair]))
)

print(output)

输出结果

运行任意一种方法,都会得到你需要的目标数据集:

# A tibble: 3 × 3
  Duration var1 var2
  <chr>   <dbl> <dbl>
1 Apr-Jun   6     2.5
2 Jun-Aug   5     4  
3 Aug-Oct   6.5   5  

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 07:28:17