将数据帧转换为类的对象" dist"没有实际计算R中的距离

时间:2012-07-05 11:43:21

标签: r distance

我有一个距离

的数据框
df<-data.frame(site.x=c("A","A","A","B","B","C"),   
site.y=c("B","C","D","C","D","D"),Distance=c(67,57,64,60,67,60))

我需要将其转换为类“dist”的对象,但我不需要计算距离,因此我可以使用dist()函数。有什么建议吗?

4 个答案:

答案 0 :(得分:13)

没有什么可以阻止你自己创建dist对象。它只是一个带有属性的距离向量,用于设置标签,大小等。

使用df,这就是

dij2 <- with(df, Distance)
nams <- with(df, unique(c(as.character(site.x), as.character(site.y))))
attributes(dij2) <- with(df, list(Size = length(nams),
                                  Labels = nams,
                                  Diag = FALSE,
                                  Upper = FALSE,
                                  method = "user"))
class(dij2) <- "dist"

或者您可以直接通过structure()执行此操作:

dij3 <- with(df, structure(Distance,
                           Size = length(nams),
                           Labels = nams,
                           Diag = FALSE,
                           Upper = FALSE,
                           method = "user",
                           class = "dist"))

这些给出:

> df
  site.x site.y Distance
1      A      B       67
2      A      C       57
3      A      D       64
4      B      C       60
5      B      D       67
6      C      D       60
> dij2
   A  B  C
B 67      
C 57 60   
D 64 67 60
> dij3
   A  B  C
B 67      
C 57 60   
D 64 67 60

注意:上面没有检查数据的顺序是否正确。确保您在df中的数据的顺序与您在示例中的顺序相同;即在运行我显示的代码之前按site.x然后site.y排序。

答案 1 :(得分:3)

我很久以前遇到过类似的问题并且解决了这个问题:

n <- max(table(df$site.x)) + 1  # +1,  so we have diagonal of 
res <- lapply(with(df, split(Distance, df$site.x)), function(x) c(rep(NA, n - length(x)), x))
res <- do.call("rbind", res)
res <- rbind(res, rep(NA, n))
res <- as.dist(t(res))

答案 2 :(得分:2)

?as.dist()应该会帮助你,不过它需要一个矩阵作为输入。

答案 3 :(得分:0)

对于从谷歌进来的人... reshape2库中的acast功能对于这种东西来说更容易。

library(reshape2)
acast(df, site.x ~ site.y, value.var='Distance', fun.aggregate = sum, margins=FALSE)