将dplyr::select多条件列筛选代码转换为base R原生写法
解决方案
完整纯base R实现代码
df_1 <- data.frame( x = replicate( n = 10, expr = runif(n = 1000, min = 20, max = 100) ) ) # 无需加载dplyr,完全使用base R语法实现原有逻辑 df_1 |> (\(x) { # 组合所有筛选条件获取目标列索引 target_idx <- head( which( grepl("^x\\.", colnames(x)) & # 对应starts_with("x.") sapply(x, is.numeric) # 对应where(is.numeric) ), 2 # 对应head(everything(), 2),取符合条件的前2列 ) cbind(x, r = apply(x[, target_idx, drop = FALSE], 1, sum, na.rm = TRUE)) })()
单独替换select部分的写法
如果你只需要替换原有代码中colnames(x = select(x, where(is.numeric) & head(x = everything(x), 2) & starts_with("x.")))这一段,直接替换为以下base R代码即可:
colnames(x)[head(which(grepl("^x\\.", colnames(x)) & sapply(x, is.numeric)), 2)]
逻辑对应说明
原dplyr select的三个筛选条件和base R的对应关系如下:
starts_with("x."):用grepl("^x\\.", colnames(x))实现,通过正则匹配列名以x.开头where(is.numeric):用sapply(x, is.numeric)实现,遍历所有列判断是否为数值类型head(everything(), 2):对同时满足前两个条件的列索引取前2个,直接用base R的head()实现
注:代码中添加drop = FALSE是为了避免目标列只有1列时,R自动将数据框降维为向量导致计算异常,和原dplyr版本的计算结果完全一致。
内容的提问来源于stack exchange,提问作者neves
相关产品推荐
相关产品推荐

