You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 05:09:03