将dplyr的filter_all(any_vars())转换为Base R实现方法问询
Base R 实现对应筛选逻辑
你提供的dplyr代码功能是筛选出任意一列包含0.5的行,对应的Base R实现可以通过以下代码完成:
set.seed(1) df <- data.frame(matrix(round(runif(500, 0, 1), digits = 1), 10, 5)) # 对应dplyr::filter_all(any_vars(grepl(0.5, .)))的Base R实现 dfn <- df[rowSums(sapply(df, function(col) grepl(0.5, col))) > 0, ]
代码逻辑说明:
sapply(df, function(col) grepl(0.5, col)):遍历数据框的每一列,对每个元素执行字符串匹配,生成与原数据框维度一致的逻辑矩阵,矩阵中TRUE表示对应位置的元素匹配到0.5。rowSums(...) > 0:计算每一行的逻辑值总和(TRUE计为1,FALSE计为0),总和大于0意味着该行至少有一个元素满足匹配条件。- 最后用这个逻辑向量对原数据框的行进行子集筛选,得到目标结果。
更严谨的数值比较版本
由于原代码用grepl是基于字符串匹配,若要针对数值直接比较(避免浮点数转字符串的潜在问题),可以把grepl(0.5, col)替换为col == 0.5:
dfn <- df[rowSums(sapply(df, function(col) col == 0.5)) > 0, ]
内容的提问来源于stack exchange,提问作者Orangemarmalade
相关产品推荐
相关产品推荐

