使用mutate(across)为单列不同截断值创建新列报错排查
代码问题分析与修正
你的代码主要有三个核心问题:
.names模板不匹配:你写的"{.col}_cutoff_{cutoffs}"里,cutoffs是向量,无法直接嵌入模板字符串。across的.names需要和.fns里的函数名称对应,应该用"{.col}_{.fn}"来自动匹配命名列表里的函数名。函数未正确接收当前列:
lapply里的function(cut) as.integer(x <= cut)直接用了x,这会指向全局环境的x,而不是across正在处理的列。必须让函数接收当前列作为参数,比如用function(col) as.integer(col <= cut)或者用.x指代当前列。.fns的函数构造逻辑错误:原代码生成的函数没有绑定截断值,需要用闭包把每个截断值绑定到对应的函数里,确保每个函数对应一个截断值。
修正后的代码(两种可选方案)
方案1:用across结合命名函数列表
library(dplyr) df <- data.frame(x = rnorm(10)) cutoffs <- c(-1, 0, 1) # 构造带截断值的命名函数列表 cut_functions <- setNames( lapply(cutoffs, function(cut) { function(col) as.integer(col <= cut) }), paste0("cutoff_", cutoffs) ) # 使用across生成新列 df <- df %>% mutate(across( .cols = everything(), .fns = cut_functions, .names = "{.col}_{.fn}" ))
方案2:更简洁的map+mutate写法
如果只处理单列,这种写法更直观:
library(dplyr) library(purrr) df <- data.frame(x = rnorm(10)) cutoffs <- c(-1, 0, 1) df <- df %>% bind_cols( map_dfc(cutoffs, ~ as.integer(df$x <= .x)) %>% setNames(paste0("x_cutoff_", cutoffs)) )
内容的提问来源于stack exchange,提问作者lethalSinger
相关产品推荐
相关产品推荐

