【问题标题】:Manipulating data using apply functions使用应用函数操作数据
【发布时间】:2018-10-01 21:29:09
【问题描述】:

我有以下数据:

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

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

谢谢!

【问题讨论】:

    标签: r loops apply data-manipulation


    【解决方案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
    

    【讨论】:

      【解决方案2】:

      没有循环并应用:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-02-26
        • 2018-08-04
        • 1970-01-01
        • 2014-10-07
        • 2022-12-13
        • 2017-09-06
        • 2021-11-23
        • 2014-05-31
        相关资源
        最近更新 更多