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

如何将多列二进制ID指示列转换为单个ID列?

没问题!我来帮你搞定这个把多列二进制ID指示列合并成单个ID列的需求——看你的输入数据,每行的id1/id2/id3里恰好只有一个1,正好可以利用这个特征来生成目标id列。先再明确下你的需求:

输入数据:

var1 var2 id1 id2 id3
obs1 . . 0 1 0
obs2 . . 1 0 0
obs3 . . 0 0 1

期望输出:

var1 var2 id1 id2 id3 id
obs1 . . 0 1 0 2
obs2 . . 1 0 0 1
obs3 . . 0 0 1 3

下面是不同工具的实现方案,你按需选用:

SAS 实现方案

如果用SAS,有两种常用方式:

方式1:数组遍历(适合后续可能增加更多id列的场景)

用数组批量处理所有id列,自动匹配1所在的位置:

data want;
    set have;
    /* 定义数组包含所有id列 */
    array id_cols[3] id1-id3;
    /* 遍历数组,找到值为1的列索引 */
    do i = 1 to dim(id_cols);
        if id_cols[i] = 1 then id = i;
    end;
    /* 删除临时变量i */
    drop i;
run;

方式2:IF-ELSE分支(列数少的时候更直观)

直接针对每列写判断逻辑:

data want;
    set have;
    if id1 = 1 then id = 1;
    else if id2 = 1 then id = 2;
    else if id3 = 1 then id = 3;
run;

R 实现方案

用tidyverse工具链的话,两种高效方法:

方式1:max.col函数(简洁高效)

利用每行只有一个1的特征,直接取最大值所在的列索引:

library(dplyr)

# 假设你的数据框名为df
df <- df %>%
    # 选中所有以id开头的列,取每行最大值的列索引
    mutate(id = max.col(select(., starts_with("id"))))

方式2:case_when分支(逻辑清晰)

适合需要明确指定对应关系的场景:

library(dplyr)

df <- df %>%
    mutate(id = case_when(
        id1 == 1 ~ 1,
        id2 == 1 ~ 2,
        id3 == 1 ~ 3,
        # 可选:处理没有1的异常行,返回NA
        TRUE ~ NA_integer_
    ))

Python Pandas 实现方案

用Pandas的话,同样有两种实用方法:

方式1:idxmax+字符串处理(高效简洁)

找到每行最大值的列名,再提取数字部分:

import pandas as pd

# 假设你的数据框名为df
id_columns = [col for col in df.columns if col.startswith("id")]
# 取每行最大值的列名,替换掉"id"转成整数
df["id"] = df[id_columns].idxmax(axis=1).str.replace("id", "").astype(int)

方式2:np.select分支(逻辑明确)

用numpy的select函数匹配条件和对应值:

import pandas as pd
import numpy as np

conditions = [
    df["id1"] == 1,
    df["id2"] == 1,
    df["id3"] == 1
]
choices = [1, 2, 3]

df["id"] = np.select(conditions, choices, default=np.nan)

内容的提问来源于stack exchange,提问作者Dr. Beeblebrox

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:47:42