如何在R语言数据框中合并逻辑向量生成非逻辑分类列?
解决R语言中逻辑向量优先级赋值问题
你的核心问题是用了标量版的if/else——它没法对数据框的每一行做逐元素判断,只会根据整个向量的首个判断结果给整列赋值,自然达不到预期效果。下面是两种可行的向量化解决方案:
方法1:嵌套ifelse(基础R实现)
利用ifelse的向量化特性,按优先级顺序嵌套判断:
df <- data.frame(log1 = c(FALSE, FALSE, TRUE, FALSE, TRUE), log2 = c(TRUE, FALSE, FALSE, FALSE, TRUE)) df$new <- ifelse(df$log1, "high", ifelse(df$log2, "outlier", "normal"))
运行后df$new的结果为:"outlier", "normal", "high", "normal", "high",完全符合high优先级最高的要求。
方法2:用dplyr::case_when(更易读的多条件写法)
如果习惯用tidyverse语法,case_when可以按顺序定义条件,优先级一目了然:
library(dplyr) df <- data.frame(log1 = c(FALSE, FALSE, TRUE, FALSE, TRUE), log2 = c(TRUE, FALSE, FALSE, FALSE, TRUE)) df <- df %>% mutate(new = case_when( log1 ~ "high", # 优先级最高:log1为TRUE时直接赋值high log2 ~ "outlier", # 次优先级:log1为FALSE但log2为TRUE时赋值outlier TRUE ~ "normal" # 剩余所有情况赋值normal ))
验证结果
最终数据框输出如下:
> df log1 log2 new 1 FALSE TRUE outlier 2 FALSE FALSE normal 3 TRUE FALSE high 4 FALSE FALSE normal 5 TRUE TRUE high
内容的提问来源于stack exchange,提问作者Peter Thwaites
相关产品推荐
相关产品推荐

