R 使用apply函数处理数据

R 使用apply函数处理数据,r,loops,apply,data-manipulation,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

我有以下数据:

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
我知道如何使用嵌套循环(这里介绍)来解决它。 但是有没有一种更快更优雅的方法,比如使用apply函数


谢谢

这里有一个使用
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))

下面是一个使用
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))

没有循环和应用:

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

x无循环并应用:

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
x
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