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

如何快速在data.frame每行间重采样与插值?支持data.table

解决方案:在相邻行间插入指定数量的插值点

针对你需要在data.frame(或data.table)的每对相邻行之间插入n个均匀插值点的需求,以下是高效的实现方案:

实现函数f

使用data.table处理可获得更好的性能,同时兼容普通data.frame输入:

library(data.table)

f <- function(df, n) {
  dt <- as.data.table(df)
  # 生成相邻行对的索引
  row_pairs <- data.table(from = 1:(nrow(dt)-1), to = 2:nrow(dt))
  
  # 遍历每个行对生成插值序列
  interpolated_list <- lapply(1:nrow(row_pairs), function(idx) {
    from_row <- row_pairs$from[idx]
    to_row <- row_pairs$to[idx]
    
    x_start <- dt$x[from_row]
    x_end <- dt$x[to_row]
    y_start <- dt$y[from_row]
    y_end <- dt$y[to_row]
    
    # 生成包含n个中间点的序列,最后一对保留终点,其余去掉重复的终点
    seq_length <- if (idx == nrow(row_pairs)) n + 2 else n + 1
    x_seq <- seq(x_start, x_end, length.out = n + 2)[1:seq_length]
    y_seq <- seq(y_start, y_end, length.out = n + 2)[1:seq_length]
    
    data.table(x = x_seq, y = y_seq)
  })
  
  # 合并结果并转回data.frame
  as.data.frame(rbindlist(interpolated_list))
}

测试示例

# 原始数据
df <- data.frame(x = c(0, 2, 10),
                 y = c(10, 12, 0))

# 测试n=1的场景
df_int <- f(df, 1)
print(df_int)
#   x  y
# 1 0 10
# 2 1 11
# 3 2 12
# 4 6  6
# 5 10 0

# 测试n=3的场景
df_int <- f(df, 3)
print(df_int)
#    x    y
# 1  0 10.0
# 2  0.5 10.5
# 3  1.0 11.0
# 4  1.5 11.5
# 5  2.0 12.0
# 6  4.0  9.0
# 7  6.0  6.0
# 8  8.0  3.0
# 9 10.0  0.0

关键说明

  • 采用线性插值(seq函数默认逻辑),如果需要非线性插值,可将seq替换为spline等对应函数。
  • data.table的处理逻辑在大数据量场景下比基础R方法更高效。
  • 自动避免相邻行序列的重复端点,保证输出结果与示例完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 18:45:38