R语言按自定义规则迭代判断并为数据框新增计算列的实现方法
R实现多条件分层生成新列mt的方法
首先构造你的原始数据集:
df <- structure(list(hhid = c(5668, 5595, 4724, 4756, 4856, 4730), me = c(1L, 1L, 0L, 0L, 0L, 0L), ls = c(0L, 0L, 1L, 1L, 1L, 1L), lsn = c("", "", "Goatry", "Goatry", "Goatry", "Goatry" ), ag = c(0L, 0L, 0L, 0L, 0L, 0L)), row.names = c(NA, 6L), class = "data.frame")
以下是两种常用的实现方案:
方法1:基础R嵌套ifelse实现
无需加载额外依赖包,直接用R基础函数即可完成:
df$mt <- ifelse( df$me == 1, 1000, ifelse( df$ls == 1, ifelse(df$lsn == "Goatry", 150, ifelse(df$lsn == "Poultry", 300, NA)), ifelse(df$ag == 1, 600, NA) ) )
逻辑完全匹配你给出的规则,不符合所有规则的行mt默认赋值为NA,可根据实际需求调整默认值
方法2:dplyr包case_when实现
代码可读性更高,条件层级清晰,是R数据处理的主流写法:
library(dplyr) df <- df %>% mutate( mt = case_when( me == 1 ~ 1000, ls == 1 & lsn == "Goatry" ~ 150, ls == 1 & lsn == "Poultry" ~ 300, ls == 0 & ag == 1 ~ 600, .default = NA ) )
case_when按从上到下的顺序匹配条件,命中第一个符合的条件就停止计算,正好匹配你规则的优先级要求,.default参数用于设置所有条件都不匹配时的默认值
运行后输出结果如下,完全符合规则要求:
print(df) # hhid me ls lsn ag mt # 1 5668 1 0 0 1000 # 2 5595 1 0 0 1000 # 3 4724 0 1 Goatry 0 150 # 4 4756 0 1 Goatry 0 150 # 5 4856 0 1 Goatry 0 150 # 6 4730 0 1 Goatry 0 150
内容的提问来源于stack exchange,提问作者Rahul Kaushik
相关产品推荐
相关产品推荐

