0

可能的重复:
将数据框转换为“dist”类的对象,而无需实际计算 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

我无法让它工作: 将数据框转换为“dist”类的对象,而无需实际计算 R 中的距离

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

也许重塑()?

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

然而,在这个例子中,他们使用了一个矩阵(),但我想使用由于内存原因而稀疏的矩阵()。

--- 此外---- 之前有一个类似的帖子。但是,我认为它的建议不适用于这种情况,在这种情况下,它们不是数据集中每个元素之间的链接 - csv 不包含所有关键字之间的成对相似性,如上一篇文章: 转换到“dist”类对象的数据框,而无需实际计算 R 中的距离

4

1 回答 1

0

尝试这个

# 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现在是因素,可能具有不同的水平,所以我们需要使它们具有可比性,例如确保"a"in与inV1相同。"a"V2

# 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)

创建一个空距离矩阵,并用和V3指定的位置处的值填充它。最后,我们将其转换为适当的对象。V1V2dist

# 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)
于 2012-09-05T07:18:42.510 回答