在 R 中跨列应用函数

apply a function across columns in R

假设我在 R 中有一个数据框 (df):

df <- data.frame(x = rnorm(5, mean = 5), u = rnorm(5, mean = 5), y = rnorm(5, mean = 5), z = rnorm(5, mean = 5))

print(df)

我想得到第一列 (x) 和其他列之间的平均绝对差 (MAD)。

通过这个函数,我可以找到第一列和另一列(例如第二列)之间的 MAD:

mad <- function(dat){
      abs(mean(dat[,1] - dat[,2], na.rm = TRUE))
}
mad(dat = df)

但我想概括该函数以应用于所有列。将函数更改为如下内容:

mad <- function(dat) {
     abs(mean(dat[,1] - dat[,2:4], na.rm = TRUE))
}
mad(dat = df)

不起作用并且 returns 此错误:“参数不是数字或逻辑:返回 NA”

我正在考虑在数据帧中使用 apply() ,因为这似乎是我在这里找到的一般建议。但是我不明白如何保持第一列不变并从第一列中减去其他列。

我们可以创建带有两个参数的函数

mad <- function(x, y) abs(mean(x - y, na.rm = TRUE))

并使用 sapply/lapply 遍历 1 以外的列,通过提取具有循环列值的第一列数据来应用 mad 函数

sapply(df[-1], function(x) mad(df[,1], x))
#         u           y           z 
#0.003399429 0.991685267 0.710553411 

这是另一个没有定义 mad 函数的选项:

sapply(abs(df[-1] - df[["x"]]), mean, na.rm = TRUE)