R语言自定义函数中如何对向量指定的多列应用pmin等函数
R自定义函数计算指定多列的每行最小值
错误原因
你原代码的写法问题有两个:
[[运算符仅支持选取单个列,传入多个列名的字符向量时会报错,选取多列需要用单中括号[pmin()要求参与计算的每一列作为独立的位置参数传入,不能直接传入多列的数据框对象
基础R实现方案
min.col <- function(data, conditions){ # do.call会把第二个参数的列表元素,拆成第一个函数的独立入参 data$Min <- do.call(pmin, data[conditions]) # 返回修改后的数据框,R函数默认不会修改外部的原数据对象 return(data) }
调用示例
# 构造示例数据集 C1 <- c(1, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0, 0) C2 <- c(0, 1, 1, 1, 0, 1, 0, 0, 0, 1, 1, 1, 0, 1, 0) C3 <- c(0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 0, 0, 1) C4 <- c(0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0) Data <- data.frame(C1, C2, C3, C4) # 调用函数,将返回的结果赋值给原对象完成更新 Data <- min.col(Data, conditions = c("C1", "C2", "C4"))
运行后查看Data$Min即可得到C1、C2、C4三列的每行最小值。
Tidyverse实现方案(适用dplyr用户)
如果你习惯使用tidyverse生态,可以用以下写法,可读性更高:
library(dplyr) min.col_tidy <- function(data, conditions){ data <- data %>% mutate(Min = pmin(across(all_of(conditions)))) return(data) }
其中all_of()用于安全匹配传入的列名字符串,避免和环境中的其他变量重名引发报错。
内容的提问来源于stack exchange,提问作者CNiessen
相关产品推荐
相关产品推荐

