如何使用核心R操作/访问“dist”类实例的元素?

28
R中一个基本/常见的类被称为"dist",它是对称距离矩阵的相对高效表示。然而,与"matrix"对象不同,似乎没有支持使用"["运算符通过索引对操作"dist"实例的功能。
例如,以下代码返回空值、NULL或错误:
# First, create an example dist object from a matrix
mat1  <- matrix(1:100, 10, 10)
rownames(mat1) <- 1:10
colnames(mat1) <- 1:10
dist1 <- as.dist(mat1)
# Now try to access index features, or index values
names(dist1)
rownames(dist1)
row.names(dist1)
colnames(dist1)
col.names(dist1)
dist1[1, 2]

同时,以下命令在某种程度上确实有效,但并不能更轻松地访问/操作特定的索引对数值:

dist1[1] # R thinks of it as a vector, not a matrix?
attributes(dist1)
attributes(dist1)$Diag <- FALSE
mat2 <- as(dist1, "matrix")
mat2[1, 2] <- 0

一个解决方法——我想要避免——是先将"dist"对象转换为"matrix",对该矩阵进行操作,然后再将其转换回"dist"。也就是说,这不是有关如何转换"dist"实例为已定义常见矩阵索引工具的"matrix"或其他类的问题;因为这在另一个SO问题中已经得到了多种回答。
stats包(或其他核心R包)中是否有专门用于索引/访问"dist"实例元素的工具?

1
好问题。我没有答案,但请注意,在R中,矩阵只是一个带有维度的向量。因此,dist1[1:20]dist1[5] <- 100等操作正常工作并不令人惊讶。经过一些努力,您可能可以编写一个二维版本,尽管我的原子知识有限。 - Ari B. Friedman
13个回答

0
如果您只想更改dist对象中的距离值(而不是属性),则可以仅替换完整矩阵即可。
odo[]<-ndo[]

其中odo是原始的dist对象,而ndo是新的dist对象,

通过将(平方)矩阵转换为dist对象使用as.dist创建。


0

disto包提供了一个类,用于在R中封装距离矩阵(内存和外存),并提供了比方便操作符[更多的功能。请在此处查看vignette

附注:我是该软件包的作者。


0

这是我获取dist对象名称对应值的实用解决方案。想要获取第9个项目的值向量吗?

as.matrix(mat1)[grepl("9", labels(mat1))]

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