我有一個資料框,其中每一行都包含權重。我想將第二個資料幀乘以第一個資料幀的每一行,然后用 rowsumS 然后 cumprod 聚合結果。對于第一個資料框中的每一行,我想保存一個元素作為結果。
我已經使用 for 回圈實作了這一點,但是這是相當低效的,特別是對于具有許多行的資料幀。
沒有for回圈有沒有辦法做到這一點?也許使用 tidyverse。
x=runif(4*6)
x=matrix(x,nrow=4,ncol=6)
x_df=as.data.frame(x)
y=rnorm(3*6)
y=matrix(y,nrow=3,ncol=6)
y_df=as.data.frame(y)
ret=rep(NA, nrow(x_df))
for (i in 1:nrow(x_df)){
rets=as.data.frame(mapply('*',y_df,x_df[i,]))
rets=tail(cumprod(1 rowSums(rets,na.rm = TRUE)),1)
ret[i]=rets
}
向量rets包含所需的結果。
uj5u.com熱心網友回復:
以下任何一項都可以:
基數 R:
apply(tcrossprod(y, x) 1, 2, prod)
[1] 0.3222529 0.1435537 -0.3998603 -2.1293011
使用matrixStats:
matrixStats::rowProds(tcrossprod(x, y) 1)
[1] 0.3222529 0.1435537 -0.3998603 -2.1293011
matrixStats::colProds(tcrossprod(y, x) 1)
[1] 0.3222529 0.1435537 -0.3998603 -2.1293011
你的代碼:
set.seed(1)
x=runif(4*6)
x=matrix(x,nrow=4,ncol=6)
x_df=as.data.frame(x)
y=rnorm(3*6)
y=matrix(y,nrow=3,ncol=6)
y_df=as.data.frame(y)
ret=rep(NA, nrow(x_df))
for (i in 1:nrow(x_df)){
rets=as.data.frame(mapply('*',y_df,x_df[i,]))
rets=tail(cumprod(1 rowSums(rets,na.rm = TRUE)),1)
ret[i]=rets
}
ret
[1] 0.3222529 0.1435537 -0.3998603 -2.1293011
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/478544.html
