使用数据框
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
和两个载体
e <- c(10, 20, 30, 40)
[1] 10 20 30 40
ti <- seq(0, 5)
[1] 0 1 2 3 4 5
我获得了输出
a1 <- lapply(d, function(x) mapply(function(x, y) x * y * ti, x, e))
$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,] 55 132 231 352
[3,] 110 264 462 704
[4,] 165 396 693 1056
[5,] 220 528 924 1408
[6,] 275 660 1155 1760
如果我用数据框替换vector e
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
我如何获得输出
$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
这样 d 和 f 是按元素操作的吗?
我知道 d 和 f 的尺寸始终相同。
更新
此外,是否有一个解决方案可以使用更复杂的函数,如d * exp(ti * f)而不是d * ti * f?
答案 0 :(得分:3)
在带有df[4:11+1][df["a"] == df["a"][4]]["a"].count()
和Map
的基础R中,您可以执行
outer
因为f中的向量长度为4,我们使用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
,得到4X6矩阵。这允许y使用回收在相应的元素上正确相乘,但需要outer(x, ti)
转置结果。
这也可以用t
运算符编写为
%o%
答案 1 :(得分:1)
一个选项是
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