在R中应用for循环的函数

时间:2011-10-21 19:17:30

标签: r

我正在为两个矩阵运行双重forloop。但是一个矩阵有大约90,000行。 在R.中太慢所以,如果可能的话,我想对此采取应用函数。

  1. 一个矩阵有90,000 X 1列,每行有字符串信息。例如1row值(ID)AAAA12
  2. 另一个矩阵也有大约90,000个但是超过90,000个X 2列,因此对于一行(ID)在第一列中具有AAAA23并且相应的月份信息例如AAAA23 Jan 第二排,AAAA12二月......等
  3. 所以,我想将一列匹配的月份信息从第二个矩阵合并到第一个垫子。

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

    任何输入都会有所帮助。

2 个答案:

答案 0 :(得分:3)

以下可能会做到这一点:

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

答案 1 :(得分:2)

apply不会比for - 循环快。您需要mergematch