我有这个数据库(缩短了)
> head(testDB,25)
Civilite Age Enfants Region Recence Frequence_visite_site Mailing_Clic
1 Mlle 18 Non Nord 5 5 Oui
2 Mlle 18 Non Sud 3 5 Oui
3 Mlle 18 Non Nord 3 8 Non
4 Mlle 18 Non Nord 7 6 Non
5 Mlle 18 Non Nord 10 5 Non
6 Mr 18 Non Nord 4 8 Oui
7 Mr 19 Non Sud 4 7 Oui
8 Mlle 20 Non Sud 4 8 Oui
9 Mlle 20 Non Sud 3 4 Oui
10 Mlle 20 Non Nord 9 4 Oui
11 Mlle 20 Non Nord 5 7 Oui
12 Mlle 20 Non Nord 3 5 Non
13 Mlle 20 Non Nord 12 4 Non
14 Mlle 20 Non Nord 15 2 Non
15 Mlle 20 Non Nord 9 7 Non
16 Mlle 20 Non Nord 18 5 Non
17 Mlle 20 Non Nord 16 4 Non
18 Mlle 20 Non Nord 12 8 Non
19 Mlle 20 Non Nord 11 8 Non
20 Mlle 21 Non Sud 4 6 Oui
21 Mlle 21 Non Sud 15 8 Oui
22 Mlle 21 Non Sud 4 8 Oui
23 Mlle 21 Non Sud 4 2 Oui
24 Mlle 21 Non Sud 6 4 Oui
25 Mr 21 Non Nord 4 8 Oui
这些是我的第一个课程中心:
> K1 = 4
CenterOfClasses = testDB[sample(1:nrow(testDB), K1, replace=FALSE), ]
CenterOfClasses
Civilite Age Enfants Region Recence Frequence_visite_site Mailing_Clic
Mlle 45 Non Nord 11 6 Non
Mr 37 Non Nord 10 7 Non
Mr 56 Non Nord 14 6 Non
Mlle 43 Non Nord 11 8 Non
在尝试计算向量(作为testDB的各个记录)和元素(作为我的类中心的每个元素)之间的差异时,我遇到了问题。
这些是我的变量:
DVar = list()
VectClasses ##Vector
VectIndVar ##Vector
VectClasses1 = CenterOfClasses[1,] etc
VectIndVar = testBD
这是我尝试使用的功能
mapply(function(x, y){
sum(identical(x,y))},
VectClasses[x,y],VectIndVar[,y])
这就是我想要做的事情:
DVar[[nClass]][nVar]=sum(VectClasses[nClass,nVar] == VectIndVar[,nVar])
(比较我的数据库的第一列和第一个变量的第一个类的值,以及可能存在的每个变量和类的值)
我改变了我的方法,现在将每个数据库记录与VectClasses的每一行进行比较
我试过这个:
xall = data.frame()
for (k in 1:nrow(VectClasses))
{
for (i in 1:nrow(VectIndVar))
{
xall[i,k] = sum(VectClasses[k,] == VectIndVar[i,])
}
}
它返回:
> head(xall)
V1 V2 V3 V4
1 3 3 2 2
2 2 2 1 1
3 3 4 3 3
4 3 4 3 3
5 4 4 3 3
6 3 2 3 3
现在,我尝试剪切循环并用apply-family函数替换它
xball = sapply(xball, function(i,k){sum(VectClasses[k,] == VectIndVar[i,])})
但它并没有填补xball
我想尽量避免循环遍历类的数量或变量的数量。
你能帮助我吗?
答案 0 :(得分:0)
ivar <- VectIndVar[rep(1:nrow(VectIndVar), nrow(VectClasses)), ]
vclass <- VectClasses[rep(1:nrow(VectClasses), each = nrow(ivar) / K1), ]
xball <- matrix(rowSums(vclass == ivar), ncol = nrow(VectClasses))
这会动态创建两个新矩阵,以便获得两个相同大小的data.frame,从而使相等测试成为可能。 (这是罗尔的想法)
与#34;#34相比,它需要的时间比循环少80倍。