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

在R中对不同起止列的行进行横向插值处理

横向插值解决方案(仅填充首尾有效值间的NA)

以下提供R和Python两种常用语言的实现方案,严格满足你的需求:仅对每行第一个有效值到最后一个有效值之间的NA进行线性插值,首尾的NA保持不变。

R语言实现

依赖包

需要tidyverse用于数据重塑,zoo提供插值函数:

library(tidyverse)
library(zoo)

处理流程

假设你的原始数据框名为df,执行以下步骤:

  1. 宽格式转长格式,方便按国家分组处理:
df_long <- df %>%
  pivot_longer(cols = -国家, names_to = "年份", values_to = "数值") %>%
  mutate(年份 = as.integer(年份))
  1. 分组插值,限定仅填充首尾有效值区间内的NA:
df_interpolated <- df_long %>%
  group_by(国家) %>%
  mutate(
    first_pos = min(which(!is.na(数值))),
    last_pos = max(which(!is.na(数值))),
    数值 = ifelse(row_number() %in% first_pos:last_pos,
                  na.approx(数值, na.rm = FALSE),
                  数值)
  ) %>%
  select(-first_pos, -last_pos) %>%
  ungroup()
  1. 转回宽格式得到最终结果:
df_final <- df_interpolated %>%
  pivot_wider(names_from = 年份, values_from = 数值)

Python语言实现

依赖库

仅需pandas:

import pandas as pd

处理流程

假设原始数据框名为df:

  1. 定义行插值函数:
def interpolate_row(row):
    # 分离国家列和数值列
    country = row['国家']
    vals = row.drop('国家')
    
    first_idx = vals.first_valid_index()
    last_idx = vals.last_valid_index()
    
    # 全NA的行直接返回
    if first_idx is None or last_idx is None:
        return row
    
    # 计算首尾有效值的位置索引
    first_pos = vals.columns.get_loc(first_idx)
    last_pos = vals.columns.get_loc(last_idx)
    
    # 仅对区间内的NA插值
    vals.iloc[first_pos:last_pos+1] = vals.iloc[first_pos:last_pos+1].interpolate(method='linear')
    
    # 重组行数据
    row.drop('国家')[vals.index] = vals
    row['国家'] = country
    return row
  1. 应用函数到每行:
df_final = df.apply(interpolate_row, axis=1)

效果验证

以你提供的样本数据为例:

  • 德国:2003年的NA会被插值为0.6,2007年的NA保持不变
  • 美国:前三个NA保持不变,2005年的NA插值为0.4
  • 法国:2004、2005年的NA分别插值为0.9、0.95
  • 比利时:2002年的NA插值为0.3,后面的两个NA保持不变

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 19:41:55