R语言如何基于数据框已有变量按条件规则创建新变量
R按条件为数据框生成新列实现方案
先给出示例数据的构造代码,可直接运行复现:
# 构造题目提供的示例数据框 df <- data.frame( Qi = c(1, 5, 4, 2), age = c(56, 62, 24, 46) )
以下提供两种常用实现方式,按需选择即可:
基础R实现(无需安装第三方包)
逻辑是先给新列赋默认值0(对应其余所有情况的赋值规则),再逐类按条件覆盖赋值:
# 初始化新列,默认值为0 df$general_capitale <- 0 # Qi=1时生成0~6区间的均匀分布随机数 row_q1 <- df$Qi == 1 df$general_capitale[row_q1] <- runif(n = sum(row_q1), min = 0, max = 6) # Qi=2时生成6~12区间的均匀分布随机数 row_q2 <- df$Qi == 2 df$general_capitale[row_q2] <- runif(n = sum(row_q2), min = 6, max = 12) # Qi=3时从指定四个值中随机抽样 row_q3 <- df$Qi == 3 df$general_capitale[row_q3] <- sample( x = c(14, 15, 17, 20), size = sum(row_q3), replace = TRUE # 必须设置放回抽样,否则符合条件行数超过4个时会触发报错 )
如果需要生成整数随机数,把对应位置的runif()替换为整数抽样即可,比如0~6区间整数就写sample(0:6, sum(row_q1), replace = TRUE)
dplyr实现(语法简洁易读)
如果日常使用tidyverse生态的函数,可以用case_when()做多条件判断,逻辑更直观:
# 未安装dplyr的话先运行 install.packages("dplyr") library(dplyr) df <- df %>% mutate( general_capitale = case_when( Qi == 1 ~ runif(n(), min = 0, max = 6), Qi == 2 ~ runif(n(), min = 6, max = 12), Qi == 3 ~ sample(c(14, 15, 17, 20), n(), replace = TRUE), TRUE ~ 0 # 匹配不到前面条件的所有行统一赋值0 ) )
运行完成后直接输入df即可查看结果,受随机数特性影响,每次运行生成的general_capitale取值会存在差异,符合随机赋值要求。
内容的提问来源于stack exchange,提问作者Majed
相关产品推荐
相关产品推荐

