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

如何在dplyr::across()中区分Interval列与数值列?

解决方案

针对你遇到的lubridate Interval列被误识别为数值列的问题,这里提供几种更简洁的处理方式:

1. 封装自定义判断函数(复用性强)

如果需要多次筛选"纯数值列(排除Interval)",可以先封装一个判断函数,后续直接调用:

# 定义判断纯数值列的函数
is_pure_numeric <- function(x) is.numeric(x) && !lubridate::is.interval(x)

# 应用到数据处理
tbl %>% mutate(across(where(is_pure_numeric), mean))

2. 利用tidyselect的组合筛选(直观简洁)

借助tidyselect的语法,可以直接组合"选中数值列 + 排除Interval列"的逻辑:

tbl %>% mutate(across(c(is.numeric, -is.interval), mean))

3. 直接基于列的类筛选

Interval类型的列带有专属的"Interval"类标记,因此可以通过判断类来排除:

tbl %>% mutate(across(where(~!inherits(., "Interval") && is.numeric(.)), mean))

补充说明

lubridate的Interval对象底层以double类型存储,所以is.double()或is.numeric()会返回TRUE,必须结合is.interval()或类判断来区分普通数值列和Interval列,上述方法都是围绕这个核心逻辑优化写法。

内容的提问来源于stack exchange,提问作者Joost Keuskamp

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 16:05:32