在R中,将两个数据帧按元素和乘以一个向量

在R中,将两个数据帧按元素和乘以一个向量,r,dataframe,apply,R,Dataframe,Apply,使用数据帧 d <- data.frame("A" = c(1.1, 2.1, 3.1, 4.1), "B" = c(5.5, 6.6, 7.7, 8.8)) A B 1 1.1 5.5 2 2.1 6.6 3 3.1 7.7 4 4.1 8.8 f <- data.frame("A" = c(10, 20, 30, 40), "B" = c(50, 60, 70, 80)) A B 1 10 50 2 20 60 3 30 70 4 40 80 所以d和f是按元

使用数据帧

d <- data.frame("A" = c(1.1, 2.1, 3.1, 4.1), "B" = c(5.5, 6.6, 7.7, 8.8))
  A   B
1 1.1 5.5
2 2.1 6.6
3 3.1 7.7
4 4.1 8.8
f <- data.frame("A" = c(10, 20, 30, 40), "B" = c(50, 60, 70, 80))
   A  B
1 10 50
2 20 60
3 30 70
4 40 80
所以d和f是按元素操作的

我知道d和f的尺寸总是相同的

更新:

另外,是否有一种解决方案可以使用更复杂的函数,如d*exp(ti*f)而不是d*ti*f?

一个选项是

library(tidyverse)
ti %>%
     map(~f*d *.)  %>%
     transpose %>%
     map(~do.call(rbind, .))
#$A
#     [,1] [,2] [,3] [,4]
#[1,]    0    0    0    0
#[2,]   11   42   93  164
#[3,]   22   84  186  328
#[4,]   33  126  279  492
#[5,]   44  168  372  656
#[6,]   55  210  465  820

#$B
#     [,1] [,2] [,3] [,4]
#[1,]    0    0    0    0
#[2,]  275  396  539  704
#[3,]  550  792 1078 1408
#[4,]  825 1188 1617 2112
#[5,] 1100 1584 2156 2816
#[6,] 1375 1980 2695 3520

在带有
Map
outer
的base R中,您可以执行以下操作

Map(function(x, y) t(outer(x, ti) * y), d, f)
$A
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]   11   42   93  164
[3,]   22   84  186  328
[4,]   33  126  279  492
[5,]   44  168  372  656
[6,]   55  210  465  820

$B
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]  275  396  539  704
[3,]  550  792 1078 1408
[4,]  825 1188 1617 2112
[5,] 1100 1584 2156 2816
[6,] 1375 1980 2695 3520
因为f中的向量长度为4,所以我们使用
外部(x,ti)
,这会产生4X6矩阵,这允许y通过循环正确地乘以相应的元素,但需要对结果进行
t
转置

这也可以用
%o%
操作符编写,如下所示

Map(function(x, y) t(x %o% ti * y), d, f)

这适用于简单的乘法。它能适用于更复杂的函数吗,比如我添加的更新?只要向量的长度是一致的。例如,
Map(function(x,y)t(outer(x,ti,“^”)*y),d,f)
会起作用。如果可能的话,我更喜欢基本的R解决方案,但我喜欢这样,因为数学函数定义很清楚。我能够轻松地将其修改为
ti%>%map(~d*exp(.*f))%>%transpose%>%map(~do.call(rbind,))
library(tidyverse)
ti %>%
     map(~f*d *.)  %>%
     transpose %>%
     map(~do.call(rbind, .))
#$A
#     [,1] [,2] [,3] [,4]
#[1,]    0    0    0    0
#[2,]   11   42   93  164
#[3,]   22   84  186  328
#[4,]   33  126  279  492
#[5,]   44  168  372  656
#[6,]   55  210  465  820

#$B
#     [,1] [,2] [,3] [,4]
#[1,]    0    0    0    0
#[2,]  275  396  539  704
#[3,]  550  792 1078 1408
#[4,]  825 1188 1617 2112
#[5,] 1100 1584 2156 2816
#[6,] 1375 1980 2695 3520
Map(function(x, y) t(outer(x, ti) * y), d, f)
$A
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]   11   42   93  164
[3,]   22   84  186  328
[4,]   33  126  279  492
[5,]   44  168  372  656
[6,]   55  210  465  820

$B
     [,1] [,2] [,3] [,4]
[1,]    0    0    0    0
[2,]  275  396  539  704
[3,]  550  792 1078 1408
[4,]  825 1188 1617 2112
[5,] 1100 1584 2156 2816
[6,] 1375 1980 2695 3520
Map(function(x, y) t(x %o% ti * y), d, f)