在 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)
假设我在 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)