首页 > 解决方案 > 在数据框的每一列上调用类似 R 的函数,并将剩余的列作为参数?

问题描述

我有一个包含多列的数据框。对于数据框中的每一列,我想在该列上调用一个函数,该函数的输入是使用数据框中剩余的列。例如,假设我有这个数据和这个接受两个参数的 testFunc:

> df <- data.frame(x=c(1,2), y=c(3,4), z=c(5,6))
> df
  x y z
1 1 3 5
2 2 4 6
> 
> testfun <- function(a, b){colMeans(a + 2 * b)} # only for illustation

假设我想应用这个 testFunc 来循环所有列。这是获得结果的循环。

> for (i in 1:nrow(df)) {
+   Y = matrix(df[, i], ncol = 1)
+   Xmat = df[, -i]
+   result[i, -i] = testfun(Y, Xmat)
+ }  
> 
> result
     [,1] [,2] [,3]
[1,]  0.0  8.5 12.5
[2,]  6.5  0.0 14.5
[3,]  0.0  0.0  0.0

有没有办法在不编写 for 循环的情况下做到这一点,也许使用 apply 函数系列?太感谢了。

标签: rdataframeapplymultiple-columns

解决方案


我们可以遍历数据集的列序列sapply/lapply,提取具有该索引的数据集列和索引上Y的剩余列-,应用testfun,分配一个已经初始化的numeric向量(长度与数据集的列数相同)根据索引 ( -i),返回vectort转置输出sapply

v1 <- numeric(ncol(df));
t(sapply(seq_along(df), function(i)  {
       v1[-i] <- testfun(as.matrix(df[i]), df[-i])
        v1
       }))

-输出

#      [,1] [,2] [,3]
#[1,]  0.0  8.5 12.5
#[2,]  6.5  0.0 14.5
#[3,]  8.5 12.5  0.0

或者这可以用tidyverse

library(dplyr)
df %>%
   summarise(across(everything(), ~ testfun(., select(df, -cur_column()))))
#    x    y    z
#1  8.5  6.5  8.5
#2 12.5 14.5 12.5

推荐阅读