0

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

我有一个 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
}
4

2 回答 2

0

我不确定,但我认为这可以满足您的要求,首先使用 afor-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
于 2013-09-03T01:30:46.747 回答
0

我使用 mtcars 数据作为解决方案:(您可以避免使用 Rfor 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个元素(不包括第一行)进行变换。

于 2013-09-02T23:11:49.987 回答