R语言基于条件计算行差值:group1为1时减去最近非NA的x值
Python Pandas 实现
核心逻辑是先对x列做前向填充(携带最近的非NA值向下传递),再按规则计算y值:
import pandas as pd import numpy as np # 构造数据集 df = pd.DataFrame({ 'value': [1,2,7,5,8,4,6,3,2], 'group1': [0,0,0,1,1,1,0,1,1], 'group2': [0,0,1,0,0,0,1,0,0], 'x': [np.nan, np.nan, 2.5, np.nan, np.nan, np.nan, 1.5, np.nan, np.nan] }) # 前向填充x的非NA值 df['x_fill'] = df['x'].ffill() # 按规则计算y df['y'] = np.where(df['group1'] == 0, 0, df['value'] - df['x_fill']) # 可选删除临时辅助列 df = df.drop('x_fill', axis=1)
输出结果与预期完全一致。
R 实现
可以用tidyverse套件快速实现,逻辑和Pandas版本一致:
library(tidyverse) # 构造数据集 df <- tibble( value = c(1,2,7,5,8,4,6,3,2), group1 = c(0,0,0,1,1,1,0,1,1), group2 = c(0,0,1,0,0,0,1,0,0), x = c(NA, NA, 2.5, NA, NA, NA, 1.5, NA, NA) ) # 计算y df <- df %>% fill(x, .direction = "down") %>% # 前向填充x mutate(y = ifelse(group1 == 0, 0, value - x))
如果不想修改原始x列,可以生成临时辅助列计算:
df <- df %>% mutate(x_fill = zoo::na.locf(x, na.rm = FALSE), y = ifelse(group1 == 0, 0, value - x_fill)) %>% select(-x_fill)
内容的提问来源于stack exchange,提问作者ZayzayR
相关产品推荐
相关产品推荐

