尽管我已经尽力了,但我仍然很难给出准确的标题。这是我的问题。
a = 1/(1:10)
b = 3/(1:10)
c = 1/(1:5)
d = 1/(1:11)
我想得到一个向量e
,使得e
包含根据从a
,b
,{{1 }}和c
。
例如,假设有两个向量d
和{1, 2}
,我想得到一个像这样的向量{3, 4}
。
谢谢!
答案 0 :(得分:8)
expand.grid
solution可以,但是在数学中有一种优雅的 Kronecker产品。
R具有函数kronecker
,但一次需要两个向量,因此对于递归应用程序,我们需要Reduce
:
oo <- Reduce(kronecker, list(a, b, c, d))
或者,使用outer
(kronecker
的主力):
rr <- Reduce(outer, list(a, b, c, d))
这更加用户友好,因为rr[i, j, u, v]
为您提供了a[i] * b[j] * c[u] * d[v]
。
备注1
请注意,oo
和rr
中的元素顺序不同。因为对于两个向量a
和b
:
kronecker(a, b) ## a[1] * b, a[2] * b ...
outer(a, b) ## a * b[1], a * b[2] ...
因此,kronecker
的以下使用产生的结果与rr
相同。
zz <- Reduce(kronecker, list(d, c, b, a))
dim(zz) <- c(length(a), length(b), length(c), length(d))
备注2
通过将a[i] + b[j] + c[u] + d[v]
中的默认操作"*"
和outer
替换为kronecker
,可以将该方法修改为执行"+"
。例如:
Reduce(function (x, y) outer(x, y, "+"), list(a, b, c, d))
备注3
johannes's answer可以改进。 apply
的逐行应用是性能杀手。我们可以执行以下操作以获得与rr
一致的结果。
xx <- Reduce("*", expand.grid(a, b, c, d))
dim(xx) <- c(length(a), length(b), length(c), length(d))
答案 1 :(得分:4)
类似这样的东西
a <- c(1, 2)
b <- c(3, 4)
现在针对您指出的问题:
apply(expand.grid(a, b), 1, prod)
x <- list(
a=c(1/(1:10)),
b=c(3/(1:10)),
c=c(1/(1:5)),
d=c(1/(1:11))
)
apply(expand.grid(x), 1, prod)
答案 2 :(得分:2)
这是一个针对两个列表执行此操作的功能。它不是效率最高的,但是可以完成工作。
my_function <- function(x, y) {
result <- c()
for(i in x) {
for(j in y) {
result <- c(result, i * j)
}
}
return(result)
}
x = c(1, 2)
y = c(3, 4)
my_function(x, y)
# [1] 3 4 6 8