簡體   English   中英

將一個數據幀乘以另一個數據幀中的每一行並聚合結果

[英]Multiply one dataframe by each row in another dataframe and aggregate result

我有一個數據框,其中每一行都包含權重。 我想將第二個數據幀乘以第一個數據幀的每一行,然后用 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包含所需的結果。

以下任何一項都可以:

基數 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM