从R转Julia新手求助:含缺失值的变量条件赋值实现
实现R风格的带缺失值逻辑判断(Base Julia)
首先还原R中的初始数据构建:
# 初始化两个带缺失值的向量 esi_offer_cps = Vector{Union{Int, Missing}}(missing, 100) esi_own = Vector{Union{Int, Missing}}(missing, 100) # 为esi_offer_cps赋值 esi_offer_cps[1:25] .= 0 esi_offer_cps[26:50] .= 1 # 为esi_own赋值 esi_own[1:16] .= 0 esi_own[25:40] .= 0 esi_own[51:62] .= 0 esi_own[63:80] .= 1
方法一:嵌套三元运算符(简洁版)
直接用map结合嵌套三元运算符,模拟R中ifelse的缺失值处理逻辑:
esi_offer = map((cps, own) -> # 条件1:esi_offer_cps为1时,直接返回1 !ismissing(cps) && cps == 1 ? 1 : # 条件2:esi_own非缺失且为1时,返回1 (!ismissing(own) && own == 1) ? 1 : # 条件3:esi_offer_cps为0时,返回0 !ismissing(cps) && cps == 0 ? 0 : # 其余情况(cps为缺失,且own非1)返回缺失 missing, esi_offer_cps, esi_own )
方法二:分步逻辑(直观版)
如果觉得嵌套三元可读性差,可以用更清晰的分支逻辑:
esi_offer = map(zip(esi_offer_cps, esi_own)) do (cps, own) if !ismissing(cps) && cps == 1 return 1 end # 检查第二个条件 own_valid = !ismissing(own) && own == 1 if own_valid return 1 end # 检查是否cps为0 if !ismissing(cps) && cps == 0 return 0 end # 剩下的情况都是缺失 return missing end
验证结果
统计各值的数量,和R的输出一致:
count_0 = sum(x -> x === 0, esi_offer) count_1 = sum(x -> x === 1, esi_offer) count_missing = sum(ismissing, esi_offer) println("esi_offer 统计结果:") println("0: $count_0, 1: $count_1, 缺失值: $count_missing")
输出结果:
esi_offer 统计结果: 0: 25, 1: 43, 缺失值: 32
关键逻辑说明
Julia中默认的&&/||及其向量化版本.&&/.||遇到missing会直接返回missing,和R的逻辑不同。我们通过手动判断ismissing来模拟R的规则:
- 只要
esi_offer_cps为1,无论esi_own是什么,结果都是1 - 若
esi_offer_cps不为1,只要esi_own非缺失且为1,结果也是1 - 若
esi_offer_cps为0,无论esi_own是什么,结果都是0 - 其余情况(
esi_offer_cps为缺失,且esi_own非1)返回缺失值
内容的提问来源于stack exchange,提问作者FGirosi
相关产品推荐
相关产品推荐

