2015-05-25 25 views
2

我有這個數據庫(縮短)的R - 值向量到單一值進行比較(使用申請家庭)

> 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 

當我試圖計算一個vector(作爲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 

現在,我試圖切割回路並將其替換爲應用系列功能

xball = sapply(xball, function(i,k){sum(VectClasses[k,] == VectIndVar[i,])}) 

但它不填寫xball

我想避免儘可能遍歷類的數量,或變量的數目。

你能幫我嗎?

+5

你能否讓你的例子可重現嗎? –

+2

你能輸入你的數據嗎? –

+1

我覺得'VectClasses [x,y],VectIndVar [,y])'似乎不正確。無論如何,一個例子會幫助 – akrun

回答

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)) 

這將動態創建兩個新矩陣,以獲得兩個相同大小的數據幀,從而使相等性測試成爲可能。 (這是Rawr的想法)

它比「for」循環花費的時間少了80倍。