在R中使用ifelse处理多列生成二值变量k时的报错问题
问题分析与解决
报错原因
你代码里的mpg:wt==3.90写法错误:mpg和wt是数据框的列,直接用:会被当成数值序列计算(比如取第一行mpg的21和wt的2.62,生成21到3的整数序列),得到的向量长度是19,而mtcars有32行,mutate要求新变量长度必须和原数据行数一致,因此触发报错。
正确实现代码
要实现「每行只要mpg到wt之间任意列包含3.90或160.0,k就取1」的需求,有两种简洁的写法:
方法1:用rowwise() + c_across()(推荐,易读)
library(tidyverse) mtcars <- mtcars %>% rowwise() %>% # 按行分组处理 mutate(k = ifelse(any(c_across(mpg:wt) %in% c(3.90, 160.0)), 1, 0)) %>% ungroup() # 取消行分组,避免后续操作受影响
c_across(mpg:wt):提取当前行中mpg到wt的所有列的值%in% c(3.90, 160.0):检查这些值是否包含目标数值any():判断该行是否至少有一个符合条件的值ifelse():根据判断结果生成1/0的二值变量
方法2:用pmap_lgl(无需行分组)
library(tidyverse) mtcars <- mtcars %>% mutate( k = as.integer( pmap_lgl(select(., mpg:wt), ~ any(c(...) %in% c(3.90, 160.0))) ) )
select(., mpg:wt):选中mpg到wt的目标列pmap_lgl():逐行对选中的列值执行判断逻辑as.integer():把逻辑判断结果(TRUE/FALSE)转为1/0
内容的提问来源于stack exchange,提问作者Amc
相关产品推荐
相关产品推荐

