如何使用R优化矩阵创建的运行时间?

时间:2015-11-05 08:54:50

标签: r

我有以下R数据框,表示每个国家/地区的每个国家/地区的销售数量(始终在2015年和每天<150)和每种类型。我有超过10万行。

    type    year    day      p_id   sales   
1   5       2015    144     7115907    2
2   13      2015    108     2339558    1    
3   8       2015    133     362237     1    
4   0       2015    24      2122871    2    
5   0       2015    35      564333     1    
6   10      2015    115     810446     1    
7   5       2015    38      239521     10   
8   12      2015    27      4516049    1    
9   3       2015    85      4352175    1    
10  4       2015    106     132568     2    

我想将这些数据存储在矩阵中。行将是p_id,列是一年中的第1天(1到150)。这是一个例子:

row.names   1   2   3   4   5   6   7   8   9   10  11  12  13  14  15  16  17  18  19  20  21  22  23  24  25  26  27  28  29  30  31  32  33  34  35  36  37  38  39  40  41  42  43  44  45  46  47  48  49  50  51  52  53  54  55  56  57  58  59  60  61  62  63  64  65  66  67  68  69  70  71  72  73  74  75  76  77  78  79  80  81  82  83  84  85  86  87  88  89  90  91  92  93  94  95  96  97  98  99
 ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
 7115907    0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
 2339558    0   0   0   0   0   1   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   1   0   0   2   1   0   0   1   1   0   2   1   1   1   0   3   1   0   1   1   0   0   0   1   0   1   0   0   1   1   0   1   1   2   2   1   1   1   0   1   1   1   1
  362237    1   1   2   1   1   1   5   1   1   1   0   1   8   1   8   2   1   1   1   1   2   3   1   3   12  4   2   1   1   1   11  2   6   2   2   8   1   6   1   1   1   1   2   1   6   1   7   2   6   1   1   7   1   2   1   3   2   4   1   2   1   4   3   1   2   3   6   1   4   2   3   2   8   1   1   10  1   5   3   4   2   1   1   3   1   1   1   1   1   1   3   1   3   2   1   1   1   1   3
 2122871    1   1   1   1   1   2   0   1   1   1   1   1   1   1   0   2   0   1   1   3   1   2   1   1   3   4   1   3   2   2   3   1   2   1   1   1   2   1   1   2   3   3   1   0   3   1   2   2   4   1   0   1   1   2   1   1   3   2   2   0   2   1   1   1   2   1   4   1   1   1   1   1   1   2   0   1   1   1   0   2   1   1   3   1   1   1   0   1   0   1   1   0   2   1   1   0   4   0   1
  564333    0   0   0   0   0   0   0   0   1   1   2   1   3   1   1   1   1   1   1   5   3   2   1   1   1   1   3   1   1   1   3   1   1   2   1   8   1   1   1   3   1   1   1   1   3   3   1   2   1   5   1   1   8   3   1   3   2   2   4   1   4   4   1   1   1   0   0   1   2   1   1   1   1   0   1   0   1   0   1   1   1   1   0   1   1   1   0   1   1   1   1   2   1   0   1   0   2   4   2
  810446    0   0   0   0   0   0   0   0   1   1   0   1   0   1   0   1   0   0   1   0   1   0   1   1   1   0   1   2   1   1   0   1   1   1   1   0   0   1   1   2   1   1   20  1   1   1   2   3   2   0   1   1   2   1   0   0   1   1   0   0   0   1   1   1   0   0   1   1   1   0   1   1   1   1   1   1   1   0   1   0   1   1   1   1   0   1   1   0   1   1   1   0   1   0   1   1   2   1   1

我有以下代码来生成矩阵。问题是它很慢。我想加快速度。有可能吗?

# input_data is the first dataframe
generate.matrix = function(input_data){
   days = 150
   p_ids = unique(input_data$p_id)
   mat = data.frame(matrix(rep(0, days*length(p_ids)), ncol=days))
   row.names(mat) <- p_ids
   colnames(mat) <- 1:days
   for(i in 1:nrow(input_data)) {
      row <- input_data[i,]
      mat[row.names(mat) == row$p_id,row$day] = row$sales
   }
   return(mat)
}

1 个答案:

答案 0 :(得分:0)

要加快代码速度,您应首先分析您的代码(have a look here)。

否则,我猜想在for循环中耗费了大量时间。用apply替换循环应该可以加快速度。

例如,您可以使用此代替for循环:

sapply(1:nrow(input_data), function(i) {
  row <- input_data[i,]
  mat[row.names(mat) == row$p_id, row$day] <- row$sales
}

但是,使用来自reshape - 系列的内容(由@Heroka建议)可能会获得加速,因为这是一个典型的reshape问题。