从 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
编辑以包含向量
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