我有一个相对基本的问题。
我有一个包含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
}
答案 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