【问题标题】:Iterating a vector over the rows of a matrix在矩阵的行上迭代向量
【发布时间】:2013-09-02 22:51:32
【问题描述】:

我有一个相对基本的问题。

我有一个 20 列和 50 行的矩阵。 我有一个包含 20 个数字的向量。

我想将向量乘以矩阵的每一行,这样每一行都建立在前一行的值之上(即 row[n]

我假设使用 for 循环是我想要执行此操作的方式,但我似乎无法找出正确的命令来让 R 执行此操作。到目前为止,它警告我“要替换的项目数不是替换长度的倍数”,并且只对矩阵的第一列执行操作。

示例代码:

trun<-50
prun<-20
M<-matrix(0,trun,prun)
M[1,]<-10
v<-seq(0.05,1,by=0.05)
for (t in 2:trun)
{
M[t]<-M[t-1]*v
}

【问题讨论】:

  • 欢迎来到 SO。您的向量 v 的长度为 20,而您的列向量的长度为 50。因此,R 会发出警告;在这种情况下,R 会回收。
  • 要引用行t,请使用M[t,] 而不是M[t]

标签: r for-loop matrix


【解决方案1】:

我使用 mtcars 数据来解决问题:(您可以避免使用 R for loop 来解决您的问题;我使用下面的 map 来解决问题)

    mydata<-mtcars[1:10,1:4]
    mydata<-as.matrix(mydata)
> mydata
                   mpg cyl  disp  hp
Mazda RX4         21.0   6 160.0 110
Mazda RX4 Wag     21.0   6 160.0 110
Datsun 710        22.8   4 108.0  93
Hornet 4 Drive    21.4   6 258.0 110
Hornet Sportabout 18.7   8 360.0 175
Valiant           18.1   6 225.0 105
Duster 360        14.3   8 360.0 245
Merc 240D         24.4   4 146.7  62
Merc 230          22.8   4 140.8  95
Merc 280          19.2   6 167.6 123

    myvec<-seq(1,8,1)
   kk<-ldply(Map(function(x) myout=myvec*mydata[(2:dim(mydata)[1]),x], as.list(colnames(mydata)))) # applying over over all columns. 
library(plyr)
myout<-t(ldply(kk))



                       [,1] [,2]   [,3] [,4]
Mazda RX4          21.0    6  160.0  110
Mazda RX4 Wag      42.0   12  320.0  220
Datsun 710         68.4   12  324.0  279
Hornet 4 Drive     85.6   24 1032.0  440
Hornet Sportabout  93.5   40 1800.0  875
Valiant           108.6   36 1350.0  630
Duster 360        100.1   56 2520.0 1715
Merc 240D         195.2   32 1173.6  496
Merc 230           22.8    4  140.8   95
Merc 280           38.4   12  335.2  246

注意:由于vec的长度只有8,所以只对每列的前8个元素(不包括第一行)进行变换。

【讨论】:

    【解决方案2】:

    我不确定,但我认为这可以满足您的需求,首先使用 for-loop,然后使用 apply。两种方法都给出了相同的答案:

    set.seed(1234)
    
    nrow <- 5
    ncol <- 7
    
    M <- matrix(floor(runif(nrow*ncol, 0, 10)), ncol = ncol, byrow=TRUE)
    M <- as.data.frame(M)
    M
    #   V1 V2 V3 V4 V5 V6 V7
    # 1  1  6  6  6  8  6  0
    # 2  2  6  5  6  5  2  9
    # 3  2  8  2  2  1  2  3
    # 4  3  1  0  2  8  5  9
    # 5  8  0  4  2  3  5  1
    
    v <- seq(1, 5, by = (5-1) / (ncol-1))
    v
    # [1] 1.000000 1.666667 2.333333 3.000000 3.666667 4.333333 5.000000
    
    for (t in 2:nrow(M))
       {
         M[t,] <- M[t-1,] * v
       }
    M
    
    M.bottom <- as.data.frame(t(sapply(seq(2,nrow(M)), function(i) { apply(M[i-1,], 1, function(x) x * v) })))
    
    new.M <- rbind(M[1,], M.bottom)
    new.M
    
    #   V1       V2        V3  V4         V5        V6 V7
    # 1  1  6.00000   6.00000   6    8.00000    6.0000  0
    # 2  1 10.00000  14.00000  18   29.33333   26.0000  0
    # 3  1 16.66667  32.66667  54  107.55556  112.6667  0
    # 4  1 27.77778  76.22222 162  394.37037  488.2222  0
    # 5  1 46.29630 177.85185 486 1446.02469 2115.6296  0
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多