R中跨多列应用else if逻辑报错,请求排查与解决
错误原因分析
across函数用法错误:across是dplyr中用于批量处理列的函数,必须在mutate、filter等dplyr动词内部使用,不能直接通过data$across(...)的方式调用——这也是错误提示“Unknown or uninitialised column:across”的直接原因。- 全局
if/else不适用:常规的if/else只能处理单个布尔值,但你的数据框有多行,需要向量化的条件判断来逐行处理。 - 多列条件判断逻辑缺失:原代码没有正确实现“所有以
act1开头的列取值一致”的判断,需要用if_all或行级处理来验证该条件。
正确实现方法
以下提供两种符合需求的实现方式,均基于dplyr完成向量化判断:
方法1:用if_all直接判断多列条件
该方法直接检查每行所有act1列是否满足指定取值,结合Day的值生成标签:
library(dplyr) # 加载样本数据 data_compressed <- structure(list(Day = c(0, 1, 0, 1, 1, 0, 1, 0, 1, 0), act1_001 = c("leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure"), act1_002 = c("leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure"), act1_003 = c("leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure"), act1_004 = c("leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure" ), act1_005 = c("leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure", "leisure")), row.names = c(NA, -10L), class = c("tbl_df", "tbl", "data.frame")) # 生成结果列 result <- data_compressed %>% mutate( label = case_when( Day == 1 & if_all(starts_with("act1"), ~ .x == "leisure") ~ "leisure1", Day == 0 & if_all(starts_with("act1"), ~ .x == "leisure") ~ "leisure0", Day == 1 & if_all(starts_with("act1"), ~ .x == "work") ~ "work1", Day == 0 & if_all(starts_with("act1"), ~ .x == "work") ~ "work0", Day == 1 & if_all(starts_with("act1"), ~ .x == "home") ~ "home1", Day == 0 & if_all(starts_with("act1"), ~ .x == "home") ~ "home0", TRUE ~ "unknown" # 处理act1列取值不统一的异常情况 ) ) print(result)
方法2:先提取行内统一活动类型,再判断
如果可以确定每行所有act1列的取值一致,可先提取该类型,再结合Day生成标签,代码更简洁:
library(dplyr) result <- data_compressed %>% rowwise() %>% mutate( act_type = first(c_across(starts_with("act1"))), # 获取该行act1列的统一取值 label = paste0(act_type, Day) # 直接拼接活动类型和Day值 ) %>% ungroup() print(result)
内容的提问来源于stack exchange,提问作者Victoria
相关产品推荐
相关产品推荐

