在R中计算分类变量的重叠度(和距离度量)

3
我将尝试根据列中的分类变量计算行(数据点)之间的距离。我所见过的最简单的方法是计算重叠部分。换句话说,x和y在多少个变量上取相同的值。

想象一下,我有一个如下的数据集;

    Id = 1:5
    dummy <- data.frame(Country = c("UK", "UK", "USA", "USA", "USA"),
                        Category = c("Private", "Public", "Private", "Private", "Public"),
                        Level = c("High", "Low", "Low", "Low", "High"))

我希望能够计算所有行之间的比例重叠(如上所述)。

我可以定义一个函数来完成此操作;

    calcOverlap <- function(Id, df) {
      n <- length(Id)
      results <- matrix(NA, n, n)
      for(i in 1:n) {
        for(j in 1:n) {
          if(i > j) {
            results[i, j] <- length(which(df[i,] == df[j,])) / ncol(df)
          }
        }
      }
      results
    }

我想它起作用了...
    dummy
    calcOverlap(Id, dummy)

我的问题是,这个已经被更整洁和更普遍地实现了吗?另外,一般来说,是否有一个包可以从分类变量计算距离度量。
谢谢!
1个回答

4
这是一种实现的方法:

有以下步骤:

outer(seq(nrow(DF)), seq(nrow(DF)), Vectorize(function(x,y) mean(DF[x,]==DF[y,])))

          [,1]      [,2]      [,3]      [,4]      [,5]
[1,] 1.0000000 0.3333333 0.3333333 0.3333333 0.3333333
[2,] 0.3333333 1.0000000 0.3333333 0.3333333 0.3333333
[3,] 0.3333333 0.3333333 1.0000000 1.0000000 0.3333333
[4,] 0.3333333 0.3333333 1.0000000 1.0000000 0.3333333
[5,] 0.3333333 0.3333333 0.3333333 0.3333333 1.0000000

然而,这样计算的比较次数超过了需要的次数。为了避免这种情况,可以使用combn函数:

# values
v = combn(seq(nrow(DF)), 2, function(x) mean(DF[x[1],]==DF[x[2],]))

# [1] 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 0.3333333 1.0000000 0.3333333 0.3333333

# row combos
r = combn(seq(nrow(DF)), 2)
#          [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10]
# [1,]    1    1    1    1    2    2    2    3    3     4
# [2,]    2    3    4    5    3    4    5    4    5     5

如果您想将它们放在矩阵中,可以使用以下代码:
m = matrix(,nrow(DF),nrow(DF))
m[t(r)] <- v

#      [,1]      [,2]      [,3]      [,4]      [,5]
# [1,]   NA 0.3333333 0.3333333 0.3333333 0.3333333
# [2,]   NA        NA 0.3333333 0.3333333 0.3333333
# [3,]   NA        NA        NA 1.0000000 0.3333333
# [4,]   NA        NA        NA        NA 0.3333333
# [5,]   NA        NA        NA        NA        NA

谢谢,我不知道combn()。感谢您抽出时间回答。您是否知道是否存在针对分类变量的其他距离度量实现? - roman
如果您查看?dist,您将看到许多不同的方法。在我看来,似乎没有一个适用于分类变量。然而,向下滚动,在“另请参阅”下提到了一些可能有帮助的包。 - Frank

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接