变量与数据框中所有其他变量的比较

时间:2017-07-04 10:45:40

标签: r dataframe similarity

我想检查一个变量与数据框中所有其他变量的接近程度。我想通过计算它们对同一行具有相同值的时间(即相同的观察值)来做到这一点。例如,在mtcars数据集中,变量gearcarb有7个观察值,在这些观察值中,它们在同一行中具有相同的值(即相同的汽车)。

我尝试过以下操作,产生closeness_matrix。然而,结果似乎是非感性的。什么不起作用?

PS:我也尝试使用mapply,我想它会更快,但它没有用,所以我最终得到了嵌套的loop

MWE:

cols_ls <- colnames(mtcars)

closeness_matrix <- matrix(nrow = ncol(mtcars),
                            ncol = ncol(mtcars))

row.names(closeness_matrix) <- cols_ls; colnames(closeness_matrix) <- cols_ls


for (i in 1:length(cols_ls)){

  for (j in i:length(cols_ls)){

    closeness_matrix[i,j] <- sum(duplicated(mtcars[,c(i,j), with = FALSE])==TRUE)

  }
}

2 个答案:

答案 0 :(得分:2)

我想以下会做到这一点(但我确信有更聪明的方法):

closenessFunc<-function(v1,M){
      apply(M, 2, function(x,v2) {
        sum(x==v)
      }, v2=v1)
    }
apply(mtcars, MARGIN = 2, closenessFunc, M=mtcars)

输出:

     mpg cyl disp hp drat wt qsec vs am gear carb
mpg   32   0    0  0    0  0    0  0  0    0    0
cyl    0  32    0  0    0  0    0  0  0    8    2
disp   0   0   32  0    0  0    0  0  0    0    0
hp     0   0    0 32    0  0    0  0  0    0    0
drat   0   0    0  0   32  0    0  0  0    1    0
wt     0   0    0  0    0 32    0  0  0    0    0
qsec   0   0    0  0    0  0   32  0  0    0    0
vs     0   0    0  0    0  0    0 32 19    0    7
am     0   0    0  0    0  0    0 19 32    0    4
gear   0   8    0  0    1  0    0  0  0   32    7
carb   0   2    0  0    0  0    0  7  4    7   32

答案 1 :(得分:0)

更改

sum(duplicated(mtcars[,c(i,j), with = FALSE])==TRUE)

sum(mtcars[,i]==mtcars[,j])

重复功能无法按照您使用它的方式运行。