在R中,按元素和向量应用两个数据帧

时间:2017-09-06 16:27:15

标签: 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

和两个载体

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?

2 个答案:

答案 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