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

如何在R语言中基于X1-X3首个非缺失值创建新变量Z?

嘿,这个需求很常见!我给你准备了R和Python两种主流工具的实现方法,完全贴合你的要求:

在R中实现

R的dplyr包提供了coalesce()函数,简直是为这个场景量身定做的——它会按你指定的顺序,返回每行第一个非缺失的值,所有值都缺失时就返回NA。

步骤如下:

# 先加载dplyr包(如果没安装的话先跑install.packages("dplyr"))
library(dplyr)

# 构造你的示例数据
df <- data.frame(
  X1 = c(1, NA, NA, NA, NA),
  X2 = c(2, 5, NA, NA, NA),
  X3 = c(3, 6, 9, 3, NA)
)

# 创建Z变量
df <- df %>% mutate(Z = coalesce(X1, X2, X3))

# 查看最终结果
print(df)

运行后你会得到完全符合预期的结果:

X1 X2 X3  Z
1  1  2  3  1
2 NA  5  6  5
3 NA NA  9  9
4 NA NA  3  3
5 NA NA NA NA
在Python中实现

如果你用pandas处理数据,有两种简洁的方法可以实现:

方法1:使用pandas的coalesce(推荐,直观易懂)

从pandas 1.2.0版本开始,支持coalesce()方法,按行从左到右取第一个非缺失值:

import pandas as pd

# 构造示例数据
df = pd.DataFrame({
    'X1': [1, None, None, None, None],
    'X2': [2, 5, None, None, None],
    'X3': [3, 6, 9, 3, None]
})

# 创建Z变量
df['Z'] = df[['X1', 'X2', 'X3']].coalesce(axis=1)

# 查看结果
print(df)

方法2:使用bfill向后填充

如果你的pandas版本较低,也可以用bfill()按行向后填充,然后取第一列的值,效果完全一样:

# 替代方案
df['Z'] = df[['X1', 'X2', 'X3']].bfill(axis=1).iloc[:, 0]

两种方法都会得到你想要的结果,最后一行的Z会是NaN(对应R中的NA)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 09:25:54