在R中的if语句中使用for循环

时间:2017-01-18 09:23:49

标签: r loops categorical-data

我有一个问题,我需要将估计的增长率乘以基数。增长率存储在矩阵中(参见下面的数据示例),基数也是如此。这本身很容易 - 问题是我对基数后面的几种类型的实体有几种增长率。

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

3 个答案:

答案 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