使用 mapply 划分 R 中的矩阵列表
Using mapply to divide lists of matrices in R
我有以下数据。
set.seed(12345)
df1z <- matrix(rnorm(10), nrow=10, ncol=10)
df2z <- df1z
dfZ <- list(df1z, df2z)
df1x <- matrix(rnorm(10), nrow=10, ncol=1)
df2x <- df1x
dfX <- list(df1x, df2x)
除了使用mapply,我基本上想执行以下设置操作。
A1 = t(t(df1z)/as.vector(df1x))
A2 = t(t(df2z)/as.vector(df2x))
当我尝试以下操作时,我得到一个空列表。
mapply(function(a, b) return(t(t(a)/b), dfZ, dfX, SIMPLIFY=F))
关于如何做到这一点有什么想法吗?
非常感谢!
括号放错地方了。如果我们修复它并添加 as.vector
,那么它给出与 A1
和 A2
相同的结果。此外,虽然它不是按预期工作所必需的,但为了稍微简化它,我们删除了不必要的 return
并使用 Map
而不是 mapply
-- Map
类似于 mapply
但没有简化。
ans <- Map(function(a, b) t(t(a)/as.vector(b)), dfZ, dfX)
identical(ans, list(A1, A2))
## [1] TRUE
我们可以复制 'b' 使长度相等,然后进行除法
ans1 <- Map(function(a, b) a/b[col(a)], dfZ, dfX)
identical(ans1, list(A1, A2))
#[1] TRUE
或使用tidyverse
library(tidyverse)
ans2 <- map2(dfZ, dfX, ~ .x/.y[,1][col(.x)])
identical(ans2, list(A1, A2))
#[1] TRUE
我有以下数据。
set.seed(12345)
df1z <- matrix(rnorm(10), nrow=10, ncol=10)
df2z <- df1z
dfZ <- list(df1z, df2z)
df1x <- matrix(rnorm(10), nrow=10, ncol=1)
df2x <- df1x
dfX <- list(df1x, df2x)
除了使用mapply,我基本上想执行以下设置操作。
A1 = t(t(df1z)/as.vector(df1x))
A2 = t(t(df2z)/as.vector(df2x))
当我尝试以下操作时,我得到一个空列表。
mapply(function(a, b) return(t(t(a)/b), dfZ, dfX, SIMPLIFY=F))
关于如何做到这一点有什么想法吗?
非常感谢!
括号放错地方了。如果我们修复它并添加 as.vector
,那么它给出与 A1
和 A2
相同的结果。此外,虽然它不是按预期工作所必需的,但为了稍微简化它,我们删除了不必要的 return
并使用 Map
而不是 mapply
-- Map
类似于 mapply
但没有简化。
ans <- Map(function(a, b) t(t(a)/as.vector(b)), dfZ, dfX)
identical(ans, list(A1, A2))
## [1] TRUE
我们可以复制 'b' 使长度相等,然后进行除法
ans1 <- Map(function(a, b) a/b[col(a)], dfZ, dfX)
identical(ans1, list(A1, A2))
#[1] TRUE
或使用tidyverse
library(tidyverse)
ans2 <- map2(dfZ, dfX, ~ .x/.y[,1][col(.x)])
identical(ans2, list(A1, A2))
#[1] TRUE