我有一个100 * 100矩阵,我愿意将每第十行乘以10。 我知道写这样的东西很容易实现:
tenthrows<-seq(from=10,to=100,by=10)
m[tenthrows,]<-m[tenthrows,]*10
但我已经要求使用&#34; for loop&#34; &#34; sapply / lapply&#34;功能。 我可以通过仅使用for循环来做到这一点:
for (i in seq(from = 10 , to = 100, by = 10)) {m[i,]<-m[i,]*10 }
但是我不知道如何加入sapply / lapply这样做,任何想法? 非常感谢提前
答案 0 :(得分:3)
生成矩阵:
m0 <- m <- matrix(1:1e4,100,100)
一种方法:
tenthrows <- seq(1,100,by=10)
m[tenthrows,] <- m[tenthrows,]*10
使用for
循环执行此操作效率会降低。我不能想出你想要这样做的理由,除非(a)这是作业,(b)这是自学,(c)有一些背景你没有被告知关于我们如果其中一个是真的,你能告诉我们吗?
纳入@ baptiste的答案:
m2 <- m0 * c(10,rep(1,9))
all.equal(m,m2) ## TRUE
这是有效的,因为R按列存储矩阵,因此每10个元素相乘相当于每第10行相乘。
另一种可能性:
m3 <- sweep(m0,MARGIN=1,FUN="*",STAT=c(10,rep(1,9)))
all.equal(m,m3) ## TRUE
请注意,原始评论(c(rep(1,9),10)
)之间的差异取决于您如何解释&#34;每隔10行&#34 ;;原始评论乘以10,20,30行...,而我的答案是乘以行1,11,21,31,......
library("rbenchmark")
benchmark(m[tenthrows,] <- m[tenthrows,]*10,
m0*c(10,rep(1,9)),
sweep(m0,MARGIN=1,FUN="*",STAT=c(10,rep(1,9))),
replications=1000)
## test replications elapsed relative
## 2 m0 * c(10, rep(1, 9)) 1000 0.109 1.000
## 1 m[tenthrows, ] <- m[tenthrows, ] * 10 1000 0.125 1.147
rep
方法(略微)更快。 (sweep
,未显示,甚至更慢,虽然它可能是最有原则的方法 - 它是最接近直接翻译的那个&#34;每10天乘以一次排除10&#34;。还值得记住的是,即使是最慢的方法也需要0.25秒才能完成1000次此任务的重复。)