使用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
相关产品推荐
相关产品推荐

