gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 13:49:00 25 4
gpt4 key购买 nike

我正在尝试根据列中的分类变量计算行(数据点)之间的距离。我见过的最简单的方法是计算重叠。换句话说,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)

我的问题是,这是否已经在某个地方更巧妙、更普遍地实现了。也更一般地说,是否有一个包来计算分类变量的距离度量。

谢谢!

最佳答案

这是一种方法:

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

关于r - 计算 R 中分类变量的重叠(和距离度量),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33371518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com