r - Multiply each observation by every other observation in another dataframe -
i have 3 sets of data. each observation in column multiply every observation in corresponding column in other datasets. example below explain; actual data has 200 rows. @ possible? need use loop? scale @ point more include more data sets.
data set 1 [a] [b] [c] [1] a1 b1 c1 [2] a2 b2 c2 [3] a3 b3 c3 data set 2 [l] [m] [n] [1] l1 m1 n1 [2] l2 m2 n2 [3] l3 m3 n3 data set 3 [x] [y] [z] [1] x1 y1 z1 [2] x2 y2 z2 [3] x3 y3 z3 output [,1] [,2] [,3] [1,] a1*l1*x1 b1*m1*y1 c1*n1*z1 [2,] a1*l1*x2 ... ... [3,] a1*l1*x3 ... ... [4,] a1*l2*x1 ... ... [5,] a1*l2*x2 ... ... [6,] a1*l2*x3 ... ... [7,] a1*l3*x1 ... ... [8,] a1*l3*x2 ... ... [9,] a1*l3*x3 ... ... [...] [27,] a3*l3*x3 ... ...
does following match want?
a <- data.frame(matrix(1:6, ncol = 2) b <- matrix(1:6, ncol = 2) c <- matrix(1:6, ncol = 2) out <- data.frame(mapply(kronecker, a, b)) out2 <- mapply(kronecker, out, c) out2 x1 x2 [1,] 1 64 [2,] 2 80 [3,] 3 96 [4,] 2 80 [5,] 4 100 [6,] 6 120 [7,] 3 96 [8,] 6 120 [9,] 9 144 [10,] 2 80 [11,] 4 100 [12,] 6 120 [13,] 4 100 [14,] 8 125 [15,] 12 150 [16,] 6 120 [17,] 12 150 [18,] 18 180 [19,] 3 96 [20,] 6 120 [21,] 9 144 [22,] 6 120 [23,] 12 150 [24,] 18 180 [25,] 9 144 [26,] 18 180 [27,] 27 216
and generalize it, use instance:
hlpfun <- function(one, two) { data.frame(mapply(kronecker, one, two)) } reduce(hlpfun,list(a,b,c))
(credit goes @wen's comment)
here test case using @ape's matrices, converted matrices data.frames
, supplied fun = paste
kroneker
(don't if want multiply numerical values):
hlpfun <- function(one, two) { data.frame(mapply(kronecker, one, two, moreargs = list(fun = paste))) } reduce(hlpfun,list(data.frame(mat1),data.frame(mat2),data.frame(mat3))) x1 x2 x3 1 a1 l1 x1 b1 m1 y1 c1 n1 z1 2 a1 l1 x2 b1 m1 y2 c1 n1 z2 3 a1 l1 x3 b1 m1 y3 c1 n1 z3 4 a1 l2 x1 b1 m2 y1 c1 n2 z1 5 a1 l2 x2 b1 m2 y2 c1 n2 z2 6 a1 l2 x3 b1 m2 y3 c1 n2 z3 7 a1 l3 x1 b1 m3 y1 c1 n3 z1 8 a1 l3 x2 b1 m3 y2 c1 n3 z2 9 a1 l3 x3 b1 m3 y3 c1 n3 z3 10 a2 l1 x1 b2 m1 y1 c2 n1 z1 11 a2 l1 x2 b2 m1 y2 c2 n1 z2 12 a2 l1 x3 b2 m1 y3 c2 n1 z3 13 a2 l2 x1 b2 m2 y1 c2 n2 z1 14 a2 l2 x2 b2 m2 y2 c2 n2 z2 15 a2 l2 x3 b2 m2 y3 c2 n2 z3 16 a2 l3 x1 b2 m3 y1 c2 n3 z1 17 a2 l3 x2 b2 m3 y2 c2 n3 z2 18 a2 l3 x3 b2 m3 y3 c2 n3 z3 19 a3 l1 x1 b3 m1 y1 c3 n1 z1 20 a3 l1 x2 b3 m1 y2 c3 n1 z2 21 a3 l1 x3 b3 m1 y3 c3 n1 z3 22 a3 l2 x1 b3 m2 y1 c3 n2 z1 23 a3 l2 x2 b3 m2 y2 c3 n2 z2 24 a3 l2 x3 b3 m2 y3 c3 n2 z3 25 a3 l3 x1 b3 m3 y1 c3 n3 z1 26 a3 l3 x2 b3 m3 y2 c3 n3 z2 27 a3 l3 x3 b3 m3 y3 c3 n3 z3
to add small explanation, mapply
goes through 2 arguments simultaneously , applies function it. data.frames
lists each column element in list, supplying 2 data.frames
mapply
, apply whatever function provide first columns, second columns, third... in both data.frames
. can use column-wise kronecker
product.
wiki
Comments
Post a Comment