我有以下数据:
set.seed(20)
pay1<-sample(1:10,10,replace=TRUE)
pay2<-sample(1:10,10,replace=TRUE)
pay3<-sample(1:10,10,replace=TRUE)
gamematrix<-cbind(pay1,pay2,pay3)
gamematrix<-data.frame(gamematrix)
gamematrix
pay1 pay2 pay3
1 9 8 5
2 8 8 1
3 3 1 5
4 6 8 1
5 10 2 3
6 10 5 1
7 1 4 10
8 1 2 10
9 4 3 1
10 4 9 7
现在,我想创建一个新的数据框,对上面的结果进行一些加权:
w=0.5
q_array<-data.frame(sapply(1:3, function(x) rep(0,10)))
for (i in 2:3){
for (j in 1:10){
q_array[j,i]=(1-w)*q_array[j,i-1]+w*gamematrix[j,i-1]
}
}
X1 X2 X3
1 0 4.5 6.25
2 0 4.0 6.00
3 0 1.5 1.25
4 0 3.0 5.50
5 0 5.0 3.50
6 0 5.0 5.00
7 0 0.5 2.25
8 0 0.5 1.25
9 0 2.0 2.50
10 0 2.0 5.50
在单词中:在第一次选择(总是“0”)之后,q_array对“gamematrix”和之前的“q_array”结果的结果赋予相同的权重。
例如:q_array的第1行:
column 1 = 0 (by definition)
column 2 = 0.5*0 + 0.5*9 = 4.5
column 3 = 0.5*4.5 + 0.5*8 = 6.25
我知道如何使用嵌套循环解决它(在此处介绍)。 但是,使用例如应用函数是否有更快更优雅的方式?
谢谢!
答案 0 :(得分:1)
以下是使用apply
的解决方案:
myweights <- function(x,w) {
y1 <- 0
y2 <- w*y1+w*x[1]
y3 <- w*y2+w*x[2]
return(c(y1,y2,y3))
}
t(apply(gamematrix, 1, myweights, w=w))
生成以下输出:
pay1 pay1
[1,] 0 4.5 6.25
[2,] 0 4.0 6.00
[3,] 0 1.5 1.25
[4,] 0 3.0 5.50
[5,] 0 5.0 3.50
[6,] 0 5.0 5.00
[7,] 0 0.5 2.25
[8,] 0 0.5 1.25
[9,] 0 2.0 2.50
[10,] 0 2.0 5.5
答案 1 :(得分:1)
没有循环并申请:
x <- gamematrix
lag1 <- function(x) cbind(0, x[, -ncol(x)]) # function to lag data.frame
p1 <- lag1(x) * (1-w)
result <- p1 + lag1(p1) * w
result
# 0 pay1 pay2
# 1 0 4.5 6.25
# 2 0 4.0 6.00
# 3 0 1.5 1.25
# 4 0 3.0 5.50
# 5 0 5.0 3.50
# 6 0 5.0 5.00
# 7 0 0.5 2.25
# 8 0 0.5 1.25
# 9 0 2.0 2.50
# 10 0 2.0 5.50