我有一个函数f(list,t)
其中第一个参数是list
,第二个参数t
是一个数字。 我想将 f 分别应用于矩阵 M 的列和向量 T 的元素。 因此,如果 M 列是 (M_1,M_2,...,M_k( 并且 T = (t_1,t_2,...,t_k(,我想得到以下内容:
f(M_1,t_1(, f(M_2,t_2(, ..., f(M_k,t_k(.
有没有一种有效的方法可以在不使用 for 循环的情况下做到这一点?
例如,如果
f <- function(list,x) {x %in% list}
M <- matrix(1:12,4,3)
T <- c(1,2,10)
我希望得到
TRUE FALSE TRUE
以下行将 f 应用于 M 的每一列和 T 的每个元素
apply(M,2,f,T)
但我需要的只是这个输出的对角线,所以我想要一种方法来避免额外的计算。
您还可以使用矩阵中的列数来使用sapply
。稍后,我们使用any
从每列返回 True(如果有(值
Tr <- c(1,2,10)
sapply(seq(ncol(M)), function(x) any(f(M[,x], Tr)))
[1] TRUE FALSE TRUE
将矩阵转换为数据框,然后使用purrr
包中的map2
函数:
library(tidyr)
df <- as.data.frame(M)
unlist(map2(df, t, f))
同样,将变量命名为T
(或F
(也是一个糟糕的主意,因为这可能会导致逻辑术语出现大量问题。
mapply(f,as.data.frame(M),T)
需要as.data.frame
才能将M
转换为矩阵列的列表,并且mapply
以成对方式将f
应用于生成的列表和向量T
。