想象一下,我有一组非常大的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秒内运行。我错过了什么?
答案 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)