R - 将向量中的值与单个值进行比较(使用apply系列)

时间:2015-05-25 14:13:04

标签: 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

在尝试计算向量(作为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

我想尽量避免循环遍历类的数量或变量的数量。

你能帮助我吗?

1 个答案:

答案 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倍。