使用case_when对rowSums结果分类时出现双向量错误的求助
问题原因与解决方案
错误根源
执行rowSums后,data从数据框变成了数值向量,而你用管道%>%将这个向量直接传给case_when时,向量会被当作case_when的第一个参数传入,但case_when的参数应该是一系列条件公式,这就触发了语法错误。
修正方案
方案一:保留数据框结构(推荐)
在数据框中新增行和列,再基于该列完成分类,既保留原始数据,也符合tidyverse的操作逻辑:
library(dplyr) # 构建数据框并完成行和计算与分类 data <- data.frame( x1 = c(1,1,1,1), x2 = c(0,1,0,1), x3 = c(1,1,0,1), x4 = c(1,1,0,0) ) %>% mutate(row_sum = rowSums(across(everything()))) %>% # 新增行和列 mutate( category = case_when( row_sum == 0 ~ 0, row_sum %in% c(1, 2) ~ 1, row_sum %in% 3:5 ~ 2 ) ) print(data)
运行结果:
x1 x2 x3 x4 row_sum category 1 1 0 1 1 3 2 2 1 1 1 1 4 2 3 1 0 0 0 1 1 4 1 1 1 0 3 2
方案二:直接处理行和向量
如果只需要分类结果,可通过大括号{}修正管道传递逻辑,避免向量被当作case_when的第一个参数:
library(dplyr) data <- data.frame( x1 = c(1,1,1,1), x2 = c(0,1,0,1), x3 = c(1,1,0,1), x4 = c(1,1,0,0) ) %>% rowSums # 用大括号包裹,确保管道传递的向量在公式中被引用 result <- data %>% { case_when( . == 0 ~ 0, . %in% c(1, 2) ~ 1, . %in% 3:5 ~ 2 ) } print(result)
运行结果:
[1] 2 2 1 2
内容的提问来源于stack exchange,提问作者doraemon
相关产品推荐
相关产品推荐

