r - 在数据框的每一列上调用类似 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 函数系列?太感谢了。
解决方案
我们可以遍历数据集的列序列sapply/lapply
,提取具有该索引的数据集列和索引上Y
的剩余列-
,应用testfun
,分配一个已经初始化的numeric
向量(长度与数据集的列数相同)根据索引 ( -i
),返回vector
并t
转置输出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
推荐阅读
- javascript - 在 JavaScript 中,对于文本到语音,当监听 voiceschanged 事件时,一系列声音没有发生任何事情?
- c# - 当我释放按钮时,如何让我的 While 循环退出/中断?
- python - Selenium 在 alpine 3.6 容器上运行
- serverless-framework - 使用无服务器框架模拟响应数据
- javascript - 无法使用 ThreeJS 和 React 导入 3D 模型
- flutter - 为 BottomNavigationBarItem Flutter 添加回调函数
- git - 自定义 git branch --list 格式,类似默认 --verbose
- jquery - 是否可以在 jQuery.each 中迭代我的对象名称?
- javascript - jQuery:在两个 DevExpress 网格中拖放,但不在它们之间
- swift - 尝试在快速单击文本字段之外的任何位置时实现隐藏键盘