r - 将一个 dataframe 乘以另一个 dataframe 中的每一行并聚合结果

我有一个 dataframe ,其中每一行都包含权重。我想将第二个 dataframe 乘以第一行的每一行,然后将结果与 rowsumS 然后 cumprod 聚合。对于第一个 dataframe 中的每一行,我想保存一个元素作为结果。

我已经使用 for 循环实现了这一点,但是这是相当低效的,特别是对于具有许多行的 dataframe 。

没有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 包含所需的结果。

回答1

以下任何一项都可以:

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

相似文章

最新文章