R语言如何基于多字段条件为dataframe新增规则匹配的c_sep变量
R语言按规则为DataFrame新增c_sep字段实现方案
以下两种方案均可完全匹配赋值规则,可根据自己的代码习惯选择:
方案1:Base R 原生实现(无第三方包依赖)
优先推荐向量化写法,运行效率高,适配百万行级大数据量:
# 假设原数据框存储在变量df中 df$c_sep <- 0 # 所有行默认赋值为0 # 匹配Qi==1或Qi==2的行,生成对应区间随机数 idx_group1 <- df$Qi %in% c(1, 2) df$c_sep[idx_group1] <- runif( n = sum(idx_group1), min = df$c_gen[idx_group1] + 6, max = df$Age[idx_group1] ) # 匹配Qi==3或Qi==4的行,生成对应区间随机数 idx_group2 <- df$Qi %in% c(3, 4) df$c_sep[idx_group2] <- runif( n = sum(idx_group2), min = df$Age[idx_group2] - 15, max = df$Age[idx_group2] ) # 兜底:将区间不合法产生的NaN/NA值替换为0 df$c_sep[is.na(df$c_sep) | is.nan(df$c_sep)] <- 0
方案2:dplyr 实现(适配tidyverse管道工作流)
如果日常使用tidyverse生态处理数据,可直接用以下代码:
library(dplyr) # 大数据量向量化写法 df <- df %>% mutate( c_sep = 0, # 处理第一类规则 c_sep = ifelse( Qi %in% c(1,2), runif(n(), min = c_gen + 6, max = Age), c_sep ), # 处理第二类规则 c_sep = ifelse( Qi %in% c(3,4), runif(n(), min = Age -15, max = Age), c_sep ), # 异常值兜底 c_sep = ifelse(is.na(c_sep) | is.nan(c_sep), 0, c_sep) )
如果数据量在10万行以内,也可以用可读性更强的行级处理写法:
library(dplyr) df <- df %>% rowwise() %>% mutate( c_sep = case_when( Qi %in% c(1,2) ~ runif(1, c_gen + 6, Age), Qi %in% c(3,4) ~ runif(1, Age - 15, Age), TRUE ~ 0 ), c_sep = ifelse(is.nan(c_sep), 0, c_sep) ) %>% ungroup()
使用注意事项
- 代码默认生成均匀分布连续随机数,如果需要生成区间内整数随机数,将
runif()替换为整数采样逻辑即可。 - 所有方案均添加了异常兜底逻辑:如果出现区间下限≥上限的逻辑异常行(例如c_gen+6≥Age),会自动将对应行c_sep赋值为0,避免产出NaN、Inf类无效值。
- 如果需要固定随机结果保证可复现,在运行代码前执行
set.seed(任意整数值,例如set.seed(1234))即可。
内容的提问来源于stack exchange,提问作者Majed
相关产品推荐
相关产品推荐

