矢量化而不是R中的循环

时间:2016-08-07 09:35:52

标签: r for-loop vectorization

我想通过用矢量化替代品替换一些'forloops'来改善我的处理时间。

下面是一个简化的例子,说明我要用更大的数据集做些什么。

df <- data.frame(time = c(10, 12, 14, 14, 14, 17, 23, 23, 30, 32), ranks = vector(mode = 'double', length = 10))

df_hilf <- data.frame(time_hilf = c(10, 12, 14, 17, 23, 30, 32), ranking_hilf = c(1, 2, 4, 6, 7.5, 9, 10))

for (j in 1:nrow(df_hilf)) {
    df$ranks[df$time == df_hilf$time_hilf[j]] <- df_hilf$ranking_hilf[j]
}

我已经生成了一个名为df的数据框,它按时间排序。目标是将另一个数据帧的排名(在此示例中称为df_hilf)分配给初始数据帧。

正如您所看到的,数据帧的长度不同,因为在df_hilf中只存储了df的唯一时间。

存储在df_hilf中的等级由特定规则计算(使用可靠性分析中的调整后的等级)。为简单起见,我在这个例子中使用过midranks。因此我真的需要存储在df_hilf中的这个特定等级。

最后,我希望df中的相同时间值具有相同的等级。

> df
   time ranks
1    10   1.0
2    12   2.0
3    14   4.0
4    14   4.0
5    14   4.0
6    17   6.0
7    23   7.5
8    23   7.5
9    30   9.0
10   32  10.0

我认为这可以使用函数replicate,但我还没有找到如何设置n参数,因为相同时间值的出现也不同。

不幸的是,我还没有在网上找到解决这个问题的方法。如果我忽略了某些事情,我道歉。

1 个答案:

答案 0 :(得分:4)

您可以使用match()

df$ranks <- df_hilf$ranking_hilf[match(df$time, df_hilf$time)]
#> df
#   time ranks
#1    10   1.0
#2    12   2.0
#3    14   4.0
#4    14   4.0
#5    14   4.0
#6    17   6.0
#7    23   7.5
#8    23   7.5
#9    30   9.0
#10   32  10.0