【问题标题】:apply function for a forloop in R在 R 中为 for 循环应用函数
【发布时间】:2011-10-21 19:17:30
【问题描述】:

我正在为两个矩阵运行双循环。但是一个矩阵有大约 90,000 行。 在 R 中它太慢了。所以,如果可能的话,我想为此使用 apply 函数。

  1. 一个矩阵有 90,000 X 1 列,每行包含字符串信息。例如 1 行值(ID)AAAA12
  2. 另一个矩阵也有大约 90,000 但略多于 90,000 X 2 列,因此对于一行(ID)在第一列有 AAAA23 和相应的月​​份信息,例如 AAAA23 Jan 第二排,AAAA12 Feb ...等

所以,我想将一列匹配的月份信息从第二个矩阵合并到第一个矩阵。

输出 mat 的第一行将是 AAAA12 Feb. 而不是使用 for 循环,我怎样才能快速生成这样的矩阵?

任何输入都会有所帮助。

【问题讨论】:

    标签: r


    【解决方案1】:

    以下方法可能会奏效:

    m1 <- matrix(c('AAAA12', 'AAAA23', 'AAAA14'))
    m2 <- cbind(c('AAAA23', 'AAAA12', 'AAAA14'), c('Jan', 'Feb', 'Mar'))
    
    cbind(m1, m2[match(m1[,1], m2[,1]),2])
    

    这给了你

         [,1]     [,2] 
    [1,] "AAAA12" "Feb"
    [2,] "AAAA23" "Jan"
    [3,] "AAAA14" "Mar"
    

    ...然后在大约 90000 行上计时显示大约需要 0.04 秒:

    x <- outer(outer(outer(LETTERS, LETTERS, paste, sep=''), 
                     LETTERS, paste, sep=''), 1:5, paste, sep='')
    set.seed(42)
    m1 <- matrix(sample(x, 85000))
    m2 <- cbind(x, seq_along(x))
    
    system.time( cbind(m1, m2[match(m1[,1], m2[,1]),2]) ) # 0.04 seconds
    

    【讨论】:

      【解决方案2】:

      apply 不会比for 循环快。你想要mergematch

      【讨论】:

        猜你喜欢
        • 2020-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-05
        • 1970-01-01
        • 1970-01-01
        • 2011-01-31
        相关资源
        最近更新 更多