R数据框中基于行排序ex变量的ifelse条件赋值通用方法
我们可以通过逐行提取ex1/ex2/ex3的最大值、计算两个较小值的和(三个值总和减去最大值即可得到),再带入条件判断实现通用化计算,无需手动区分每个id的变量排序。
基础R实现(向量化运算,效率最高)
# 计算ex1/ex2/ex3每行的最大值 max_ex <- pmax(dat$ex1, dat$ex2, dat$ex3) # 计算每行两个较小值的和 = 三个值总和 - 最大值 sum_small_ex <- dat$ex1 + dat$ex2 + dat$ex3 - max_ex # 条件判断更新ex列,已修正你示例中id1条件的笔误 dat$ex <- ifelse(dat$ran <= max_ex & dat$ran > sum_small_ex, 5, dat$ex)
运行示例数据得到的结果如下:
id ex1 ex2 ex3 ex ran 1 1 0.8 0.10 0.04 5 0.5 2 2 0.2 0.40 0.30 1 0.7 3 3 0.3 0.04 0.50 5 0.6
其中id2的ran值0.7大于三个ex的最大值0.4,不满足条件,ex保留原值1;id1、id3满足判断条件,ex更新为5,符合规则要求。
dplyr实现(可读性强,适合tidyverse workflow)
library(dplyr) dat <- dat %>% rowwise() %>% mutate( max_ex = max(c_across(ex1:ex3)), sum_small_ex = sum(c_across(ex1:ex3)) - max_ex, ex = ifelse(ran <= max_ex & ran > sum_small_ex, 5, ex) ) %>% ungroup() %>% select(-max_ex, -sum_small_ex) # 不需要中间计算列可在此处删除
内容的提问来源于stack exchange,提问作者C.F.
相关产品推荐
相关产品推荐

