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

使用ifelse/else if创建新变量:基于列条件生成fam_type列

R语言根据列值组合生成新列的实现方案

原始数据集

先给出原始的数据集代码:

id<-c("aaa","bbb","ccc","ddd","eee","fff")
a<-c(1,1,2,NA,1,1)
b<-c(2,NA,NA,2,NA,NA)
c<-c(3,2,1,3,NA,NA)
d<-c(NA,NA,NA,4,NA,NA)
e<-c(NA,NA,NA,NA,5,NA)
f<-c(NA,NA,NA,1,NA,NA)
dat1<-data.frame(id,a,b,c,d,e,f)

条件规则

需根据以下优先级规则生成fam_type列:

  • 若行内包含1、2、3、4的组合,标记为ext
  • 若行内包含1和5的组合,标记为grand
  • 若行内仅包含1和3(无其他有效数值),标记为single
  • 若行内包含(1,2,3)组合或(1,2)组合,标记为nuc
  • 其余情况标记为other

说明:规则优先级必须严格遵循,比如包含1、2、3、4的行同时满足nuc的条件,因此要先判断ext规则避免误判。

实现代码

使用嵌套ifelse结合行遍历实现,核心逻辑是先提取每行非NA值,再逐一匹配规则:

# 定义判断每行类型的函数
get_fam_type <- function(row) {
  vals <- na.omit(row[-1]) # 排除id列,提取当前行非NA数值
  has_1 <- 1 %in% vals
  has_2 <- 2 %in% vals
  has_3 <- 3 %in% vals
  has_4 <- 4 %in% vals
  has_5 <- 5 %in% vals
  
  # 按优先级嵌套判断
  ifelse(has_1 & has_2 & has_3 & has_4, "ext",
         ifelse(has_1 & has_5, "grand",
                ifelse(has_1 & has_3 & length(vals) == 2, "single",
                       ifelse((has_1 & has_2 & has_3) | (has_1 & has_2), "nuc",
                              "other"))))
}

# 应用函数生成新列
dat1$fam_type <- apply(dat1, 1, get_fam_type)

# 查看最终结果
print(dat1)

运行后得到的fam_type列结果为:

[1] "nuc"   "nuc"   "nuc"   "ext"   "grand" "single"

注:原始需求中给出的fam_type有7个值,与数据集的6行不符,上述结果为对应6行数据的正确输出。

内容的提问来源于stack exchange,提问作者nms

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:54:26