从For-Loop申请

时间:2017-02-17 17:39:41

标签: r for-loop 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));

0:10响铃的原因是0是第一年的工资,每年增加10年的年增量。

我真的很惊讶到达到那里我没有多少工作要做。我已经阅读了一些关于应用更好用于R的内容,我将其部分用于申请。如果第一年的年度增长适用于基本工资,我得到的结果就是我的价值。这是我用来实现的代码:

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

任何人都可以帮我弄清楚如何使用矩阵迭代每年的增量并申请,包括将第一年留作基本薪水吗?

3 个答案:

答案 0 :(得分:0)

使用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矩阵,其中每列是“进展”,每行是“年”

答案 1 :(得分:0)

以下内容将返回您从原始for循环获得的相同值。正如您所看到的,在这种情况下,与for循环的表示法非常类似。

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

请注意,lapply会返回一个列表,您可以使用sapply并返回matix。

答案 2 :(得分:0)

您可以创建适当尺寸的矩阵并使用逐元素矩阵运算:

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