将一个数据帧乘以另一个数据帧中的每一行并汇总结果
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
我有一个数据框,其中每一行都包含权重。我想将第二个数据帧乘以第一个数据帧的每一行,然后用 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