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

使用apply前需筛选data.frame数值列?求tidyverse简化方案

用dplyr/tidyverse筛选含非有限值的行

针对你的需求,这里有两种简洁的tidyverse实现方式,核心思路是先锁定数值列,再判断每行是否存在非有限值(NA、NaN、Inf等):

方法一:使用if_any(推荐,效率更高)

if_any是dplyr 1.0.0及以上版本的函数,能向量化检查指定列中是否任意一列满足条件,写法最简洁:

library(dplyr)

UNI <- data.frame(text = c("a", "b", "c"), x = c(1, NA, NaN), y = 1:3)

# 筛选目标行
UNI %>%
  filter(if_any(where(is.numeric), ~ !is.finite(.x)))

逻辑说明:

  • where(is.numeric):自动识别数据框中的所有数值类型列(这里是x和y)
  • ~ !is.finite(.x):判断列中的值是否为非有限值(is.finite会对NA、NaN、Inf/-Inf返回FALSE,取反后就是我们要找的情况)
  • if_any:只要该行的任意一个数值列满足条件,就保留该行

方法二:使用rowwise + c_across

如果习惯行式操作,可以用这种写法,不过效率略低于if_any:

UNI %>%
  rowwise() %>%
  filter(any(!is.finite(c_across(where(is.numeric))))) %>%
  ungroup()

逻辑说明:

  • rowwise():将数据框按行分组
  • c_across(where(is.numeric)):提取当前行的所有数值列值,组成向量
  • any(!is.finite(...)):判断该向量中是否存在非有限值,满足则保留该行
  • ungroup():取消行分组,恢复数据框默认结构

这两种方法都能精准筛选出数值列含NA/NaN等非有限值的行,避免了文本列干扰,写法比手动筛选列后用apply简洁得多。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 15:02:38