从大数字向量创建计数矩阵

时间:2014-05-07 15:44:54

标签: r matrix

想象一下,我有一组非常大的X,Y数字,介于0和1之间(暂时忽略第三列):

0.5 0.1 1.88093e-296
0.500559    0.100946    1.14878e-296
0.500708    0.100903    1.00751e-296
0.500708    0.100903    1.00751e-296
0.498227    0.100267    8.935e-296
0.488925    0.0997211   2.70318e-292
0.484398    0.100495    1.19442e-290
0.476617    0.10003 7.06571e-288
0.474858    0.0993702   2.95419e-287
0.470889    0.0990931   7.00569e-286

我试图创建一个计数矩阵,其中包含在特定值括号内出现的X,Y的数量。例如,

中出现了多少个数据点
0.49<X<0.5 and 0.49<Y<0.5 

要做到这一点,我想要一个2D矩阵,其中包含该括号内X,Y的数量。我写了以下内容:

data <- read.table(args[1]);

sizeuse<-100;

mdat <- matrix(rep(0,sizeuse*sizeuse), nrow = sizeuse, ncol = sizeuse)
nr<-nrow(data);

for(i in 1:nr){#1:1000) {
  x<-floor(data[i,]$V1/(1/sizeuse));
  y<-floor(data[i,]$V2/(1/sizeuse));

  mdat[ x , y  ] <- mdat[ x  , y  ]+1;
}

Sizeuse是0到1之间括号数量的大小。问题是这段代码需要永远,我在C ++中编写了相同的算法,它在2秒内运行。我错过了什么?

1 个答案:

答案 0 :(得分:1)

所以使用样本数据

dd<- data.frame(
    X = c(0.5, 0.500559, 0.500708, 0.500708, 0.498227, 
        0.488925, 0.484398, 0.476617, 0.474858, 0.470889),
    Y = c(0.1, 
        0.100946, 0.100903, 0.100903, 0.100267, 0.0997211, 0.100495, 
        0.10003, 0.0993702, 0.0990931),
    OTHER = c(1.88093e-296, 1.14878e-296, 
        1.00751e-296, 1.00751e-296, 8.935e-296, 2.70318e-292, 1.19442e-290, 
        7.06571e-288, 2.95419e-287, 7.00569e-286)
)

我会用

xc<-cut(dd$X, breaks=(46:51)/100)
yc<-cut(dd$Y, breaks=(9:11)/100)

table(xc,yc)

这些中断涵盖了样本表的范围,但如果您需要100x100矩阵,则可以将它们更改为breaks=(0:100)/100。确保cut的间隔具有您想要的正确打开/关闭侧。您始终可以通过运行sum( table(xc,yc) ) == nrow(dd)

来检查以确保所有值都在表格中