我有类似的代码。我把它放在
之下a<-rnorm(3)
b<-rnorm(10)
c<-array(NA,dim=c(30,1))
for(i in 1:length(a)){
for(j in 1:length(b)){
c[j]<-a[i]-b[j]
}
}
问题:c应该创建30个值而不是10个。因为a有3个值而b有10个。每个a值都应该从b中减去,从而创建一个带有(30,1)的新值。 我该怎么办?
答案 0 :(得分:2)
在c
数组中使用适当的索引:
for (i in 1:length(a)) {
for (j in 1:length(b)) {
c[(i-1)*length(b) + j] <- a[i]-b[j]
}
}
索引(i-1)*length(b) + j
将从1开始(length(b)
字词消失)。随着i
中外循环的每次迭代,我们将c
数组偏移length(b)
次已经完成的外部迭代次数。
在R中可能有一种更好,更矢量化的方法。但从编程的角度来看,这是一个有趣的问题。
答案 1 :(得分:0)
您也可以使用模运算符%%
来获取所有组合,但顺序会有所不同:
for(i in 1:length(c)) {
c[i] <- a[i %% na + 1L] - b[i %% nb + 1L]
}
或者矢量化的东西:
rep(a, 10) - rep(b, 3)
但也许最容易处理的解决方案是使用扩展网格来首先获得所有组合:
combins <- expand.grid(a, b)
combins[[1]] - combins[[2]]
答案 2 :(得分:0)
您可以使用for()
:
sapply()
循环
m <- sapply(a, function(x) x-b)
将返回一个矩阵:
> m
[,1] [,2] [,3]
[1,] -0.51424921 -0.60356757 -0.7822274
[2,] 0.03871073 -0.05060763 -0.2292674
[3,] 1.21963235 1.13031399 0.9516542
[4,] 1.27048573 1.18116737 1.0025076
[5,] -0.37353476 -0.46285312 -0.6415129
[6,] -1.01243929 -1.10175765 -1.2804174
[7,] 0.94637733 0.85705897 0.6783992
[8,] -0.74198691 -0.83130528 -1.0099651
[9,] 1.06881319 0.97949482 0.8008350
[10,] 1.61434836 1.52502999 1.3463702
您可以使用as.vector()
转换为一维数组:
> as.vector(m)
[1] -0.51424921 0.03871073 1.21963235 1.27048573 -0.37353476 -1.01243929 0.94637733 -0.74198691 1.06881319 1.61434836
[11] -0.60356757 -0.05060763 1.13031399 1.18116737 -0.46285312 -1.10175765 0.85705897 -0.83130528 0.97949482 1.52502999
[21] -0.78222735 -0.22926741 0.95165421 1.00250759 -0.64151290 -1.28041743 0.67839919 -1.00996506 0.80083504 1.34637021