2015-12-11 87 views
1

我所使用的大部分数据集一般都是中等大小(大多数少于100k行),因此我的代码执行时间对我来说通常不是那么大的问题。减少计算时间

但是我最近试图编写一个函数,它将2个数据帧作为参数(例如,使用n行),并返回一个包含m * n行的新数据帧。然后我必须对结果数据集执行一些操作。因此,即使在小数值的情况下(比如每个数值大约为1000),所得到的数据帧也会有超过一百万行。

当我尝试对这个数据集进行简单的操作时,代码需要很长的时间才能运行。具体来说,我的结果数据框有2列与数值,我需要添加一个新的列,将比较这些列的值,并将它们分类为 - “大于”,“小于”,“绑”

我现在用下面的代码:

df %>% mutate(compare=ifelse(var1==var2,"tied", 
       ifelse(var1>var2,"Greater than","lesser then") 

而且,正如我前面提到的,这需要永远运行。我对此做了一些研究,我发现显然data.table上的操作比dataframe快得多,所以也许这是我可以尝试的一种选择。

但我从来没有使用过data.tables。因此,在我深入研究之前,我很想知道是否有其他方法可以加快大型数据集的计算时间。

您认为我可以尝试其他的选择吗?

谢谢!

+3

使用'sign'在这种情况下:'比较= C( “捆绑” “比更小的”, “大于”)号(VAR1,VAR2)+2]' – nicola

+2

已经有非常大的合作R中的数据集(高达1500万行),只需咬紧牙关即可切换到data.table。它不仅可以通过正确的向量化代码加速代码10x +,而且我认为语法更容易理解。我放弃了开关,并且感到遗憾,因为我花了很多时间等待我的函数运行大型数据框架。 –

回答

1

对于像这样的大问题,我喜欢并行化。由于对各行的操作是原子操作,这意味着对特定行的操作结果独立于其他行,这是一种“不同程度的并行”情况。

library(doParallel) 
library(foreach) 

registerDoParallel() #You could specify the number of cores to use here. See the documentation. 

df$compare <- foreach(m=df$m, n=df$n, .combine='c') %dopar% { 
    #Borrowing from @nicola in the comments because it's a good solution. 
    c('Less Than', 'Tied', 'Greater Than')[sign(m-n)+2] 
} 
+0

非常感谢您的意见和建议! – Dataminer