You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 13:57:11