在R的tidyverse/dplyr管道中,将仅含0/1的变量转为Yes/No因子
解决方法:自动筛选0/1变量并转换为Yes/No因子
完整可运行代码
library(dplyr) df <- data.frame( var1 = c(0, 1, 0, 1, 1, 0, 1), var2 = c("1", "1", "0", "0", "1", "1", "0"), var3 = c("1", "1", "0", "0", "1", "3", "1"), var4 = c(0, 0, 1, 1, 1, 0, 3), var5 = c("Yes", "No", "Yes", "No", "Yes", "No", "Yes"), var6 = c("Yes", "No", "Yes", "No", "Yes", "No", "Maybe") ) # 转换逻辑 df_processed <- df %>% mutate(across( # 筛选仅含0/1(含数值型和字符型)的变量 where(~ all(.x %in% c(0, 1, "0", "1"))), # 转换为带Yes/No标签的因子 ~ factor(ifelse(.x %in% c(1, "1"), "Yes", "No"), levels = c("Yes", "No")) )) # 查看结果 str(df_processed)
原代码错误原因
- 筛选条件逻辑错误:
unique(.) == c("0", "1")会返回长度等于unique(.)的逻辑向量,而where()需要的是返回单个逻辑值的函数(判断该变量是否符合条件),因此触发"无法转换逻辑矩阵为函数"的报错。 - 类型未兼容:原条件只判断了字符型的"0"/"1",但
var1是数值型的0/1,会被遗漏。
关键逻辑说明
- 变量筛选:
where(~ all(.x %in% c(0, 1, "0", "1")))遍历每个变量,检查所有元素是否都属于0、1、"0"、"1",同时兼容数值型和字符型的0/1变量。 - 因子转换:用
ifelse将1/"1"映射为"Yes",0/"0"映射为"No",再通过factor()指定水平顺序,确保因子的排序符合预期。
内容的提问来源于stack exchange,提问作者ECII
相关产品推荐
相关产品推荐

