我有以下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)
}
答案 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
问题。