【问题标题】:Getting the index of an iterator in R (in parallel with foreach)在 R 中获取迭代器的索引(与 foreach 并行)
【发布时间】:2014-09-01 02:59:39
【问题描述】:

我正在使用foreach 函数迭代data.frame 的列。在每次迭代中,我想获取迭代器的索引(即所考虑的列的索引或名称)和列本身。

但是,下面的代码最初看起来不错,但由于i 没有namescolnames 属性,所以它不起作用。

 foreach(i=iter(base[1:N],by='col')) %dopar% c(colnames(i),i)

现在,如果您想知道我为什么不迭代索引,原因是我正在使用 %dopar% 工具,我不想将整个基础发送给所有工作人员,而只发送每个列其中需要。

问题:如何获取迭代器的索引?

谢谢

【问题讨论】:

    标签: r foreach parallel-processing indexing iterator


    【解决方案1】:

    这里有几种可能性:

    修改iter 函数(或编写您自己的函数),以便不仅仅是发送列的值,而是包含名称或其他信息)

    您可以迭代索引,但使用共享内存工具(例如 Rdsm 包),以便每个进程只需要获取它需要的部分数据帧,而不是分发整个数据帧。

    您可以将基本数据框转换为一个列表,其中每个元素都包含相应的基本列以及列名,然后遍历该列表(因此发送整个元素,但不发送其他元素)。

    【讨论】:

    • 当很容易编写返回自定义迭代器的函数时,我认为制作通用 iter 函数或 iter.data.frame 函数的修改版本不是一个好主意。这就是我在编写自定义迭代器函数的小插曲中描述的方式。
    【解决方案2】:

    我只想在 foreach 循环中指定第二个迭代变量作为计数器:

    library(foreach)
    library(iterators)
    
    df <- data.frame(a=1:10, b=rnorm(10), c=runif(10))
    r <- foreach(d=df, i=icount()) %do% {
        list(d=d, i=i)
    }
    

    如果不使用参数,iterators 包中的“icount”函数将返回一个无限计数迭代器,因此无论数据框中的列数如何,此示例都有效。

    您还可以将列名作为第三个迭代变量:

    r <- foreach(d=df, i=icount(), nm=colnames(df)) %do% {
        list(d=d, i=i, nm=nm)
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-05
      • 2020-05-21
      • 2015-02-27
      • 2011-05-12
      • 1970-01-01
      • 1970-01-01
      • 2010-09-13
      相关资源
      最近更新 更多