Использование mapply для разделения списков матриц в R - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующие данные.

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))

Есть мысли о том, как это сделать?

Большое спасибо!

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Мы могли бы просто скопировать '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
0 голосов
/ 10 мая 2018

Скобки не на месте. Если мы исправим это и добавим 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...