我试图消除我们用来在零售环境中制作决策树的一些遗留代码的枷锁。我在R中玩了hclust,它很漂亮,我想用它。用于计算距离的繁重工作是在SQL中完成的,我得到如下输出:
main with dist
A A 0.00
A B 1.37
A C 0.64
B B 0
B C 0.1
C C 0
现在作为数据框加载(只是读取SQL查询转储),但hclust想要一个距离矩阵。 。E.g,:
A B C
--+-----------------
A | 0
B | 1.37 0
C | 0.64 0.1 0
我的想法过于程序化,我现在试图在嵌套循环中进行。有人能指点我做更多R-idiomatic的方向吗?
感谢!
答案 0 :(得分:2)
如果您在R中寻找实际距离矩阵,请尝试:
as.dist(xtabs(dist ~ with + main, mydf), diag = TRUE)
# A B C
# A 0.00
# B 1.37 0.00
# C 0.64 0.10 0.00
我假设" main"的组合和#34;与"是唯一的,否则xtabs
会将" dist"值。
答案 1 :(得分:0)
我建议将字母更改为数字(使用ASCII代码直接转换),然后使用R矩阵的线性化索引以矢量方式访问每对。
最小例子:
N <- 3
d <- data.frame(x = c(1,2), y = c(2,3), v = c(0.1, 0.2))
m <- matrix(0, N, N)
m[(d$y-1)*N+d$x] = d$v
输出结果为:
[,1] [,2] [,3]
[1,] 0 0.1 0.0
[2,] 0 0.0 0.2
[3,] 0 0.0 0.0
编辑:要将任意字符串保留为行和列名称,请考虑以下示例:
codes <- c('A','B','C')
N <- 3
d <- data.frame(x = c('A','B'), y = c('B','C'), v = c(0.1, 0.2))
m <- matrix(0, N, N)
m[(vapply(d$y, function(x) which(codes == x), 0)-1)*N+
vapply(d$x, function(x) which(codes == x), 0)] = d$v
rownames(m) = codes
colnames(m) = codes