使用应用函数处理数据

时间:2018-04-21 08:39:34

标签: r loops apply data-manipulation

我有以下数据:

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

我知道如何使用嵌套循环解决它(在此处介绍)。 但是,使用例如应用函数是否有更快更优雅的方式?

谢谢!

2 个答案:

答案 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