r - 在 r 中运行程序的更简单方法。两个 for 的 47,022,066 次操作

标签 r for-loop time

这是我的问题:
我有两个数据库。其中一个( BASE1 )有一些墨西哥州及其相应的自治市( 19,138 Obs. )为 2008-2009 年如下:

 1. **State            Municipality   Year      ID** 
 2. Aguascalientes   Calvillo       2008       _
 3. Aguascalientes   Calvillo       2009       _
 4. Baja California  Tecate         2008       _
 5. Baja California  Tecate         2009       _
 6. (...)

另一个数据库 ( BASE2 ) 包含所有城市的 ID ( 2,457 Obs ):
 1. **State              Municipality   ID**
 2. Aguascalientes     Calvillo       1001
 3. Baja California    Tecate         2003 
 4. (...)

我想要的是为BASE1中的每个观察分配相应的ID(BASE2)。

我创建以下代码:
for (i in 1:2457){
  for (j in 1:19138) {
    if (BASE_2$MUNICIPALITY_NAME[i]==BASE1$MUNICIPALITY_NAME[j] && BASE2$STATE_NAME[i]==BASE1$STATE_NAME[j]) {
      BASE1$MUNICIPALITY_ID[j]=BASE2$MUNICIPALITY_ID[i]
    } 

  }

}

我以这种方式创建代码的原因:
if (BASE_2$MUNICIPALITY_NAME[i]==BASE1$MUNICIPALITY_NAME[j] **&& BASE2$STATE_NAME[i]==BASE1$STATE_NAME[j]**) 

是因为有些州有同名的自治市。

代码有效(我用基础的子集测试了它),但是运行时间太长。问题是这样的:

有什么办法可以减少代码工作的时间?因为据我所知,操作次数是 2,457 次 19,138 = 47,022,066(太多了)

最佳答案

你能用合并吗

base1  <- data.frame(key1 = letters[1:6], key2 = letters[7:12], values = 1:6)

base1
  key1 key2 values
1    a    g      1
2    b    h      2
3    c    i      3
4    d    j      4
5    e    k      5
6    f    l      6

base2  <- data.frame(key1 = letters[1:6], key2 = letters[7:12], values = 12:17)

base2
  key1 key2 values
1    a    g     12
2    b    h     13
3    c    i     14
4    d    j     15
5    e    k     16
6    f    l     17

merge(base1, base2, by = c("key1", "key2"))
  key1 key2 values.x values.y
1    a    g        1       12
2    b    h        2       13
3    c    i        3       14
4    d    j        4       15
5    e    k        5       16
6    f    l        6       17

关于r - 在 r 中运行程序的更简单方法。两个 for 的 47,022,066 次操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21395358/

相关文章:

c++ - 平均值计算不正确

python - 运行 Python 脚本, 'Memory error', 'for' 循环

sql - 在 H2 数据库中插入当前日期和时间

c++ - 为什么 std::future::wait_for 的行为不如预期?

r - 在R中以长格式(相对于基组)按组计算跨行的增长率

r - 绘制 UTM/坐标

python - 在 Python 中迭代绘制 'Bow Tie'

r - geom_bar 从最小到最大数据值

r - 使用 R 将日期序列添加到数据框中

c# - 将文本格式化为日期/时间格式 c#