在 R 中应用 forloop 函数

发布于 2024-12-11 12:44:29 字数 392 浏览 0 评论 0原文

我正在为两个矩阵运行双 forloop。但一个矩阵大约有 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 ...等

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

输出矩阵的第一行将是 AAAA12 Feb,而不是使用 for 循环,如何快速生成这样的矩阵?

任何输入都会有帮助。

I am running double forloop for two matrices. but one matrix has around 90,000 rows.
it is too slow in R. so, I would like to take apply function for this if possible.

  1. One matrix has 90,000 X 1 column with string information per row. e.g 1row value(ID) AAAA12
  2. The other matrix has also around 90,000 but a bit more than 90,000 X 2 columns, so for one row(ID) has AAAA23 in 1st column and corresponding month information e.g AAAA23 Jan
    And 2nd row, AAAA12 Feb ...etc

So, I would like to merge one column of matched month information from 2nd matrix to 1st mat.

1st row of output mat is going to be AAAA12 Feb. instead of using for loop, how can I generate such a matrix quickly?

Any input will be helpful.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无尽的现实 2024-12-18 12:44:29

下面的代码可能会解决这个问题:

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

The following might do the trick:

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])

Which gives you

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

...And then timing it on around 90000 rows shows it takes around 0.04 seconds:

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
無處可尋 2024-12-18 12:44:29

apply 不会比 for 循环快。您想要合并匹配

apply will be no faster than a for-loop. You want merge or match.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文