0

基本上我有一个大数据框:10,000,000x900(行,列),我正在尝试并行转换每列的类。最终结果需要是一个 data.frame

这是我到目前为止所得到的:

假装df是已经定义的数据框,所有列都是数字和字符类的混合

library(snow) 
cl=makeCluster(50,type="SOCK")
cl.out=clusterApplyLB(cl,df,function(x)factor(x,exclude=NULL))

cl.out是我想要的列表,除了我需要的是作为 data.frame 类

所以这就是我卡住的地方......我是否尝试将 cl.out 的所有元素组合到一个不会并行的 data.frame 中?(慢,时间是个问题)

我可以用不同的包实现其他东西吗?(前锋?)

我是否必须对一些 c 进行硬编码才能有效地完成这项工作?

任何帮助,将不胜感激。

谢谢,

4

3 回答 3

2

一种有用的范例是对所有列进行子集df化和替换,将其视为类似列表

df[] <- lapply(df, factor, exclude=NULL)

正如您对 的调用所暗示的那样,您真的在一台机器上有 50 个内核makeCluster吗?如果您不在 Windows 机器上,请使用该parallel软件包,mclapply而不是

library(parallel)
options(mc.cores=50)
df[] <- mclapply(df, factor, exclude=NULL)

这真的会帮助您进行整体评估吗?分发和检索数据的成本似乎与进行计算的成本一样高。

> f = factor(rep("M", 10000000), levels=LETTERS)
> df = data.frame(f, f, f, f, f, f, f, f)
> system.time(lapply(df, factor, exclude=NULL))
   user  system elapsed 
  2.676   0.564   3.250 
> system.time(clusterApply(cl, df, factor, exclude=NULL))
   user  system elapsed 
  1.488   0.752   2.476 
> system.time(mclapply(df, factor, exclude=NULL))
   user  system elapsed 
  1.876   1.832   1.814 

(多核和多进程时序可能变化很大)。

于 2013-04-19T00:48:11.287 回答
1

如果你有一个这样大小的 data.frame,我认为你会很快遇到内存问题

我认为它会更快,更高效。

你可以使用set

library(data.table)

# to set as a data.table without having to copy 
setattr(df, 'class', c('data.table','data.frame')
alloc.col(df)

for(nn in names(df)){
   set(df, j = nn, value = factor(df[[nn]])
 }

值得一读的data.table和并行计算

于 2013-04-19T00:59:00.677 回答
0

由于 data.frame 是一个带有class属性的列表,您只需将列表转换为 data.frame,使用as.data.frame.

cl.out <- as.data.frame(cl.out)

我注意到列名丢失了:如果您确定它们的顺序相同,您可以使用以下命令重新设置它们:

names(cl.out) <- names(df)
于 2013-04-18T20:39:18.603 回答