применить функцию для forloop в R - PullRequest
1 голос
/ 21 октября 2011

Я использую двойной forloop для двух матриц. но одна матрица имеет около 90 000 строк. это слишком медленно в R. поэтому я бы хотел воспользоваться функцией apply для этого, если это возможно.

  1. Одна матрица имеет 90 000 X 1 столбец со строковой информацией на строку. например, 1-рядное значение (ID) AAAA12
  2. Другая матрица также имеет около 90 000, но чуть более 90 000 столбцов X 2, поэтому для одной строки (ID) в первом столбце указано значение AAAA23 и соответствующая информация о месяце, например, AAAA23 Jan И 2-й ряд, AAAA12 февраля ... и т. Д.

Итак, я хотел бы объединить один столбец с информацией о соответствующем месяце из 2-й матрицы в 1-й мат.

1-й ряд выходного мата будет AAAA12 февраля. Вместо использования цикла for, как я могу быстро сгенерировать такую ​​матрицу?

Любой вклад будет полезен.

Ответы [ 2 ]

3 голосов
/ 21 октября 2011

Следующие действия могут помочь:

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 голосов
/ 21 октября 2011

apply будет не быстрее, чем for -петл.Вы хотите merge или match.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...