使用2D键缓慢填充矩阵:值数据

时间:2015-06-23 21:30:47

标签: r vectorization

我有一个包含3个变量超过1,100万条记录的数据集。我创建了一个这样的地图:

map <- matrix(, nrow = 115, ncol = 42)
map[(2:nrow(map)),1]<-sapply(1:(nrow(map)-1), function(x) 420+5*(x-1))
map[1,(2:ncol(map))] <- sapply(1:(ncol(map)-1), function(x) -10+.5*(x-1))

我想查看每个条目,如果满足两个条件,则将第一列的值存储在向量中。然后在最后,取该向量的平均值并将其存储在地图中。

for ( i in 2:42){
  for (j in 2:2){
    values <- c()
    sapply(1:nrow(data),function(k){
        if (data[k,2] == map[j,1] & data[k,3] == map[1,i]){
           values<-c(values,data[k,1])
        }
     })
     if(length(values) != 0){
       map[j,i] = mean(values)
     }
 }
}

第一个问题是它需要永远。第二个问题是地图没有更新,但我相信在解决第一个问题时可以修复一次。我没有并行处理的经验,但确实有一些申请家庭。任何帮助将不胜感激!

1 个答案:

答案 0 :(得分:0)

我猜你以后想要将这个&#34; map&#34; -object的坐标移动到rownames和colnames位置,但这样的事情应该快得多:

这是一个&#34;数据&#34;例如:

data <- cbind( value=sample(36),  expand.grid(x=1:6, y=1:6))

dat2 <- as.data.frame( as.table (  tapply(data[,1], list( x=data[,2], y=data[,3] ), 
                                     FUN=mean, na.rm=TRUE) ) )
map[ cbind( 1+as.numeric(dat2[,1]), 1+as.numeric(d

at2[,2])) ]  <- dat2[,3]
> map[1:10,1:10]
      [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
 [1,]   NA  -10 -9.5   -9 -8.5   -8 -7.5   -7 -6.5    -6
 [2,]  420   27 10.0   22 28.0   21 25.0   NA   NA    NA
 [3,]  425    7 11.0    1 20.0    4  6.0   NA   NA    NA
 [4,]  430   16  9.0   24 23.0   18 30.0   NA   NA    NA
 [5,]  435   26  2.0   35 12.0   34 32.0   NA   NA    NA
 [6,]  440    3 14.0   19  5.0   15  8.0   NA   NA    NA
 [7,]  445   33 17.0   31 29.0   36 13.0   NA   NA    NA
 [8,]  450   NA   NA   NA   NA   NA   NA   NA   NA    NA
 [9,]  455   NA   NA   NA   NA   NA   NA   NA   NA    NA
[10,]  460   NA   NA   NA   NA   NA   NA   NA   NA    NA

您需要发布代码才能为data - 对象制作正确的测试用例。