R表示循环问题

时间:2018-01-30 14:28:10

标签: r loops

我有类似的代码。我把它放在

之下
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)的新值。 我该怎么办?

3 个答案:

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