【问题标题】:Vectorization instead of looping in R矢量化而不是在 R 中循环
【发布时间】:2016-08-07 09:35:51
【问题描述】:

我想通过用矢量化替代方案替换一些“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 一起使用,但我还没有找到如何设置nargument,因为相同时间值的出现也不同。

很遗憾,我也没有在网上找到解决此问题的方法。如果我忽略了什么,我深表歉意。

【问题讨论】:

    标签: r for-loop vectorization


    【解决方案1】:

    你可以使用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
    

    【讨论】:

    • 谢谢,这是我要找的功能。
    猜你喜欢
    • 2014-02-07
    • 2020-05-03
    • 1970-01-01
    • 2016-02-11
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2012-06-11
    相关资源
    最近更新 更多