【问题标题】:CSV of Distances to Dist Object R [duplicate]距离对象 R 的距离的 CSV [重复]
【发布时间】:2026-01-04 10:05:02
【问题描述】:

可能重复:
Convert a dataframe to an object of class “dist” without actually calculating distances in R

我有一个非常大的 csv 文件(因此 R 中的 for 循环需要很长时间)关键字之间的相似性,当我读入 data.frame 时看起来像这样:

> df   
kwd1 kwd2 similarity  
a  b  1  
b  a  1  
c  a  2  
a  c  2 

我想把它转换成一个 dist 对象,像这样:

> dObject  
  a b  
b 1    
c 2 0

我无法让它工作: Convert a dataframe to an object of class "dist" without actually calculating distances in R

我的另一个想法是使用 Matrix() 创建一个稀疏矩阵,但我不确定如何有效地填充矩阵,因为我的 csv 相当大 - 可能是一个应用函数?

也许 reshape()?

---- 更新---- 这似乎适用于上面的玩具数据集: https://stats.stackexchange.com/questions/6827/efficient-way-to-populate-matrix-in-r

然而,在这个例子中,他们使用了一个 matrix(),但我想使用 Matrix(),因为内存的原因是稀疏的。

--- 此外---- 之前有一个类似的帖子。但是,我认为它的建议不适用于这种情况,在这种情况下,它们不是数据集中每个元素之间的链接——csv 不包含所有关键字之间的成对相似性,如上一篇文章所示: Convert a dataframe to an object of class "dist" without actually calculating distances in R

【问题讨论】:

  • 你试过什么没用?我认为我们应该等待关闭作为重复,直到 OP 有时间详细说明。

标签: r csv matrix


【解决方案1】:

试试这个

# Generate some dummy data (since you didn't provide your data)
df <- data.frame(V1=sample(letters, 10, TRUE),
                 V2=sample(letters, 10, TRUE),
                 V3=sample(200, 10, TRUE))

df$V1df$V2 现在是因子,可能具有不同的水平,因此我们需要使它们具有可比性,例如确保V1 中的"a"V2 中的"a" 相同。

# Convert letters to integers
my.objects <- sort(unique(c(as.character(df$V1), as.character(df$V2))))
df$V1 <- match(df$V1, my.objects)
df$V2 <- match(df$V2, my.objects)

创建一个空距离矩阵,并在V1V2 指定的位置使用V3 中的值填充它。最后,我们将其转换为正确的dist 对象。

# Create an empty distance matrix
n <- length(my.objects)
dist.mat <- matrix(NA, n, n)
i <- as.matrix(df[-3])
dist.mat[i] <- dist.mat[i[,2:1]] <- df$V3

my.dist <- as.dist(dist.mat)

【讨论】:

  • 你好,我的数据和我上面写的例子差不多。这些字母应该是关键字名称,第三列是它们的相似性。抱歉,如果不清楚。
  • 这条线对我不起作用:dist.mat[i]
  • 这就是我正在使用的:kwds = unique(c(array(df[,1]), array(df[,2]))) df = as.matrix(df) colnames (df) = c(1,2,3) f = function(x){ x = which(x == kwds) } if(nrow(df)
  • 无论您有字母还是关键字都无所谓,它应该适用于任何数据类型。如果最后一行不起作用,请确保 i 是一个包含两列的矩阵。如果不是这样,我会发现很难诊断。