如何快速在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
相关产品推荐
相关产品推荐

