如何使用tidyverse中的purrr基于多变量生成新指示变量?
使用purrr实现多变量判断的简便方法
当然有啦!用purrr来处理这种需要遍历多列做行级判断的需求非常顺手,我给你两种简洁的实现方式,你可以根据自己的习惯选择:
方法1:用pmap_lgl处理行级检查
这种方法直接针对每一行的所有DX变量做检查,逻辑很直观:
library(tidyverse) # 假设你的数据集名为df,先选中所有DX开头的列,然后逐行检查是否有值为4 df <- df %>% mutate( NewVar = as.integer( pmap_lgl(select(., starts_with("DX")), ~ any(c(...) == 4, na.rm = TRUE) ) ) )
select(., starts_with("DX")):帮你快速选中DX1到DX26的所有变量(如果你的变量命名规则严格是DX+数字,这个写法完全没问题)pmap_lgl(..., ~ any(c(...) == 4, na.rm = TRUE)):对每一行的DX值,把它们合并成一个向量,检查是否存在等于4的元素;na.rm = TRUE用来忽略空值(NA),避免空值导致判断结果出错as.integer(...):把逻辑值TRUE/FALSE转换成1/0,刚好对应你需要的NewVar取值
方法2:用map+reduce做列级合并
如果你更习惯先对每一列做判断,再合并结果,这种方法也很高效:
df <- df %>% mutate( NewVar = as.integer( select(., starts_with("DX")) %>% map(~ .x == 4) %>% # 把每个DX列转成"是否等于4"的逻辑向量 reduce(`|`, na.rm = TRUE) # 按行对所有逻辑向量做"或"运算,只要有一个TRUE就返回TRUE ) )
这个思路是先把每一列都转换成“该列值是否为4”的逻辑标记,再通过reduce把这些标记按行合并——只要某一行有任意一个DX列是4,最终结果就是TRUE,最后转成整数即可。
两种方法都能完美实现你的需求,你可以根据自己的代码风格选择~另外记得保留na.rm = TRUE,不然空值会让你的NewVar出现NA,影响结果准确性。
内容的提问来源于stack exchange,提问作者user10717947
相关产品推荐
相关产品推荐

