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

在R语言中基于数据框A、B列按条件创建新列的方法求助

条件生成新列的解决方案

数据框示例

A    B 
| 0  | NA |
| 1  | NA |
| 1  | 0  |
| 1  | 0  |
| 1  | 1  |
| 0  | NA |
| 1  | NA |
| 1  | 0  |
| 1  | 0  |
| 1  | 1  |

生成新列的规则

  • 当A = 0且B = NA时,新列值为0
  • 当A = 1且B = 0时,新列值为0
  • 当A = 1且B = 1时,新列值为1
  • 当A = 1且B = NA时,新列值为NA

理想结果

A    B    new_col
| 0  | NA | 0  
| 1  | NA | NA
| 1  | 0  | 0
| 1  | 0  | 0
| 1  | 1  | 1
| 0  | NA | 0  
| 1  | NA | NA
| 1  | 0  | 0
| 1  | 0  | 0
| 1  | 1  | 1

解决方案

1. Python(Pandas)

方法一:用numpy.select批量处理(适合大数据集)

import pandas as pd
import numpy as np

# 构造示例数据
df = pd.DataFrame({
    'A': [0,1,1,1,1,0,1,1,1,1],
    'B': [np.nan, np.nan, 0, 0, 1, np.nan, np.nan, 0, 0, 1]
})

# 定义条件与对应值
conditions = [
    (df['A'] == 0) & (df['B'].isna()),
    (df['A'] == 1) & (df['B'] == 0),
    (df['A'] == 1) & (df['B'] == 1),
    (df['A'] == 1) & (df['B'].isna())
]
values = [0, 0, 1, np.nan]

# 生成新列
df['new_col'] = np.select(conditions, values)

print(df)

方法二:用apply逐行处理(适合小数据集)

import pandas as pd
import numpy as np

df = pd.DataFrame({
    'A': [0,1,1,1,1,0,1,1,1,1],
    'B': [np.nan, np.nan, 0, 0, 1, np.nan, np.nan, 0, 0, 1]
})

def get_new_col(row):
    if row['A'] == 0 and pd.isna(row['B']):
        return 0
    elif row['A'] == 1 and row['B'] == 0:
        return 0
    elif row['A'] == 1 and row['B'] == 1:
        return 1
    elif row['A'] == 1 and pd.isna(row['B']):
        return np.nan

df['new_col'] = df.apply(get_new_col, axis=1)

2. R语言

方法一:用dplyr的case_when(推荐写法)

library(dplyr)

# 构造示例数据
df <- data.frame(
    A = c(0,1,1,1,1,0,1,1,1,1),
    B = c(NA, NA, 0, 0, 1, NA, NA, 0, 0, 1)
)

# 生成新列
df <- df %>%
    mutate(new_col = case_when(
        A == 0 & is.na(B) ~ 0,
        A == 1 & B == 0 ~ 0,
        A == 1 & B == 1 ~ 1,
        A == 1 & is.na(B) ~ NA_real_
    ))

print(df)

方法二:基础R的ifelse嵌套

df <- data.frame(
    A = c(0,1,1,1,1,0,1,1,1,1),
    B = c(NA, NA, 0, 0, 1, NA, NA, 0, 0, 1)
)

df$new_col <- ifelse(df$A == 0 & is.na(df$B), 0,
                     ifelse(df$A == 1 & df$B == 0, 0,
                            ifelse(df$A == 1 & df$B == 1, 1,
                                   ifelse(df$A == 1 & is.na(df$B), NA, NA))))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 17:20:13