在R中获取迭代器的索引(与foreach并行)

4
我正在使用foreach函数来遍历一个data.frame的列。在每次迭代时,我想获得迭代器的索引(即考虑的列的索引或名称)和该列本身。
然而,以下代码似乎一开始很好,但由于i没有namescolnames属性,因此无法正常工作。
 foreach(i=iter(base[1:N],by='col')) %dopar% c(colnames(i),i)

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

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

谢谢

2个回答

10

我只需在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)
}

1

以下是几种可能的方法:

修改iter函数(或编写自己的函数),使其不仅发送列的值,还包括名称或其他信息。

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

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


我认为制作修改版的通用iter函数或iter.data.frame函数并不是一个好主意,因为很容易编写一个返回自定义迭代器的函数。这就是我在撰写自定义迭代器函数的指南中所描述的方式。 - Steve Weston

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接