R语言中对多列应用多if-else条件生成新列的实现方法
R 实现(基于dplyr)
首先构造示例数据集:
df <- data.frame( Column1 = c(3, 2, 1, NA, 2, NA), Column2 = c(3, 3, NA, 4, NA, NA), Column3 = c(1, 2, 2, 1, NA, NA) )
按照优先级判断规则计算Column4:
library(dplyr) df <- df %>% rowwise() %>% mutate( # 统计每行三列的非NA数量 non_na_num = sum(!is.na(c(Column1, Column2, Column3))), Column4 = case_when( # Column1和Column2都非NA时,走条件1、2 !is.na(Column1) & !is.na(Column2) ~ ifelse(Column1 == Column2, Column1, 5), # 三列全NA走条件5 non_na_num == 0 ~ NA_real_, # 仅1个非NA走条件4 non_na_num == 1 ~ na.omit(c(Column1, Column2, Column3))[1], # 剩余场景(Column1/2存在NA、非NA数≥2)走条件3取Column3 TRUE ~ Column3 ) ) %>% ungroup() %>% select(-non_na_num)
Python 实现(基于pandas)
构造示例数据集:
import pandas as pd import numpy as np df = pd.DataFrame({ 'Column1': [3, 2, 1, np.nan, 2, np.nan], 'Column2': [3, 3, np.nan, 4, np.nan, np.nan], 'Column3': [1, 2, 2, 1, np.nan, np.nan] })
自定义行逻辑函数计算Column4:
def get_column4(row): c1, c2, c3 = row['Column1'], row['Column2'], row['Column3'] # 处理Column1、Column2都非空的场景 if pd.notna(c1) and pd.notna(c2): return c1 if c1 == c2 else 5 # 统计当前行非空值数量 non_na_cnt = sum(pd.notna([c1, c2, c3])) # 全空返回NA if non_na_cnt == 0: return np.nan # 仅1个非空返回该值 if non_na_cnt == 1: return [x for x in [c1, c2, c3] if pd.notna(x)][0] # 其余场景返回Column3 return c3 df['Column4'] = df.apply(get_column4, axis=1)
两种实现运行后得到的结果和预期输出完全一致。
内容的提问来源于stack exchange,提问作者Tannya Kumar
相关产品推荐
相关产品推荐

