我有一个问题,我需要将估计的增长率乘以基数。增长率存储在矩阵中(参见下面的数据示例),基数也是如此。这本身很容易 - 问题是我对基数后面的几种类型的实体有几种增长率。
set.seed(1223)
Typ1.rates <- c(1.1,1.2,0.9,1.4)
Typ2.rates <- c(1.4,5.2,1.9,0.4)
g.rates <- t(cbind(Typ1.rates, Typ2.rates))
x <- as.data.frame(matrix(rexp(16, rate=.2), ncol=4)*100)
x$Type <- c(1,1,1,2)
因此,如果给定行的类型== 1,我想将第一个观察值与Typ1.rates中的第一个观察值相乘(即[1,1]),依此类推。
如果我有两种类型的速率,这显然很容易,但如果我有25种类型,以及大型矩阵/数据帧,那么手动操作就很难了。
任何人都有这么好的方法吗?
如果需要更多解释或数据/代码,请告诉我
编辑:
使用上面的种子集我希望得到以下矩阵
V1 V2 V3 V4
1: 141.8580480 1149.9857213 303.4234747 1014.77951629
2: 770.1481988 407.0247813 1219.3383377 156.62140585
3: 554.1117304 983.2339648 239.1584652 50.52442765
4: 584.8300270 1207.7605414 2252.7680594 43.13052390
答案 0 :(得分:5)
使用简单的乘法
set.seed(1223)
g.rates[x[, 5], ] * x[, -5] # Note in your question you missed to include Typ2.rates
或使用data.table
library(data.table)
setDT(x)[, .SD*g.rates[x$Type,] , .SDcols = paste0("V", 1:4)]
# V1 V2 V3 V4
#1 141.8580 1149.9857 303.4235 1014.77952
#2 770.1482 407.0248 1219.3383 156.62141
#3 554.1117 983.2340 239.1585 50.52443
#4 584.8300 1207.7605 2252.7681 43.13052
答案 1 :(得分:1)
<强>摘要强>
您可以直接在数据框中创建条件以分配新值,如下所示:
x[x$Type == 1, ]
这将显示与x
==1
值
接下来您需要使用已添加的费率,例如:
x[x$Type == 1, ] * Typ1.rates
最终代码
假设您希望遍历所有类型并使用条件,如下所示:
Typ1.rates <- c(1.1,1.2,0.9,1.4)
Typ2.rates <- c(1.4,5.2,1.9,0.4)
g.rates <- t(cbind(Typ1.rates, Typ1.rates))
x <- as.data.frame(matrix(rexp(16, rate=.2), ncol=4)*100)
x$Type <- c(1,1,1,2)
for(i in 1:nrow(g.rates)) {
# We apply the change to the n-1 columns in order to prevent any change to the type column
x[x$Type == i, 1:(ncol(x)-1) ] <- x[x$Type == i, 1:(ncol(x) -1) ] * as.list(g.rates[i,])
}
执行起来应该非常快。
答案 2 :(得分:1)
我们可以在base R
do.call(rbind, Map(`*`, split(x[-5], x$Type),
split(g.rates, row(g.rates))))
# V1 V2 V3 V4
#1.1 141.8580 1341.650 303.4235 869.81101
#1.2 840.1617 373.106 1896.7485 100.68519
#1.3 453.3641 983.234 292.3048 50.52443
#2 584.8300 1207.761 2252.7681 43.13052