R语言中如何获取coalesce函数返回值对应的来源列名?
实现方法
你可以直接通过行位置匹配的方式实现,逻辑和coalesce()从左到右选首个非空值的规则完全对齐,不需要逐列写硬编码判断,代码可扩展性更强。
可运行完整代码
library(tidyverse) result <- tibble(car1 = c("honda", NA, NA), car2 = c(NA, "mazda", NA), car3 = c("toyota", "ferrari", "porsche") ) %>% mutate( pick = coalesce(car1, car2, car3), col_choice = names(.)[max.col(!is.na(across(c(car1, car2, car3))), ties.method = "first")] )
逻辑说明
across(c(car1, car2, car3))选中所有参与优先级判断的列!is.na(...)将单元格值转为逻辑值:非空值标记为TRUE,空值标记为FALSEmax.col(..., ties.method = "first")逐行定位第一个取值为TRUE的列位置,和coalesce()的取值规则完全一致- 用位置索引匹配数据集的列名,即可得到每个pick值对应的来源列名称
运行后得到的结果和你预期的结构完全一致:
# A tibble: 3 × 5 car1 car2 car3 pick col_choice <chr> <chr> <chr> <chr> <chr> 1 honda NA toyota honda car1 2 NA mazda ferrari mazda car2 3 NA NA porsche porsche car3
如果后续需要增减参与优先级判断的列,只需要修改across()里选中的列范围即可,不需要调整其他逻辑。
内容的提问来源于stack exchange,提问作者mdb_ftl
相关产品推荐
相关产品推荐

