在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
相关产品推荐
相关产品推荐

