在矩阵的行上迭代向量

时间:2013-09-02 22:51:33

标签: r for-loop matrix

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

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

我想在矩阵的每一行上乘以向量,使得每一行都建立在前一行的值上(即row [n]< -row [n-1] * 1.5)。

我假设使用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
}

2 个答案:

答案 0 :(得分:0)

我使用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个元素(不包括第一行)。

答案 1 :(得分:0)

我不确定,但我认为这样做符合您的要求,首先使用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