从 For-Loop 申请

From For-Loop to apply

编辑以包含向量

BaseSal <- c(22745,23606,24761,25873,27097,28533,30153,31813,
             33588,35492,37524,39630,41935,44346,46855,49483,
             52260,55222,58211,61194,64441,67900,71493,75299,
             79455,83641,88169,92811,97673,102780,108257,114015,
             120216,126620,133184,139879,147219,137346); 

AnnualInc <- c(678,703,730,762,815,843,876,907,939,981,1045,1081,
               1125,1201,1245,1293,1355,1327,1382,1440,1503,1566,
               1631,1694,1766,1838,1935,2010,2088,2164,2245,2321,
               2397,2480,2560,2648,2731,1); 

我的以下代码包含 Vector BaseSal 和 38 个不同职位的基本工资,以及 Vector AnnualInc,这是 38 个职位中每个职位的基本工资每年增加的金额。此代码完美运行:

for (i in 1:38)
  print(BaseSal[i]+(AnnualInc[i] * 0:10));

rang的原因0:100是第一年工资,每年递增10年

我真的很惊讶我只需要做那么少就可以到达那里。我已经阅读了一些关于 apply 更适合在 R 中使用的内容,我让它在 apply 中部分工作。如果将第一年的年度增长应用于基本工资,我得到的结果会给我带来价值。这是我用来到达那里的代码:

l<-matrix(BaseSal,38,11,FALSE); 
apply(l,2,function(z) z+(AnnualInc));

谁能帮我弄清楚如何使用矩阵遍历每年的增量并申请,包括将第一年仅作为基本工资?

使用 apply 你可以:

set.seed(48)

baseSal <- rnorm(38, 100, 5)
annInc <- rnorm(38, 10, 1)
mydf <- data.frame(baseSal, annInc)

class(mydf)
[1] "data.frame"

head(mydf)
    baseSal    annInc
1 100.99880  9.895188
2  86.09930  8.874881
3  96.52124 10.909675
4 110.37700 12.670161
5 103.95111 10.248833
6 102.44925  8.058972

res <- apply(mydf, 1, function(x) {x[1] + x[2] * 0:10})

基本上将两个向量合并为一个对象,即 data.frame,然后为每一行计算你想要的内容。 您将得到一个 10x38 矩阵,其中每一列是一个 'progression',每一行是一个 'year'

以下将 return 与您从原始 for 循环中获得的值相同。如您所见,在这种情况下,在符号上与 for 循环非常相似。

lapply(1:38, function(i){
  BaseSal[i]+(AnnualInc[i] * 0:10)
})

注意 lapply return 是一个列表,您可以使用 sapply 得到一个矩阵。

您可以制作一个适当维度的矩阵并使用 element-wise 矩阵运算:

m <- l + AnnualInc * (col(l) - 1)

head(m)
##       [,1]  [,2]  [,3]  [,4]  [,5]  [,6]  [,7]  [,8]  [,9] [,10] [,11]
## [1,] 22745 23423 24101 24779 25457 26135 26813 27491 28169 28847 29525
## [2,] 23606 24309 25012 25715 26418 27121 27824 28527 29230 29933 30636
## [3,] 24761 25491 26221 26951 27681 28411 29141 29871 30601 31331 32061
## [4,] 25873 26635 27397 28159 28921 29683 30445 31207 31969 32731 33493
## [5,] 27097 27912 28727 29542 30357 31172 31987 32802 33617 34432 35247
## [6,] 28533 29376 30219 31062 31905 32748 33591 34434 35277 36120 36963