我的问题是删除特定的用途,看起来像这样:如何转换一个组合:首先使用combn(letters[1:4], 2)计算组合
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] "a" "a" "a" "b" "b" "c"
[2,] "b" "c" "d" "c" "d" "d" 使用每列获取另一个数据框:
[,1] [,2] [,3] [,4] [,5] [,6]
[1,] 1 2 3 4 5 6从上述数据帧的第一列中获取元素,例如:第一个元素
那么我如何将上面的数据帧转换为矩阵,例如结果,例如:
a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0具有相同列和行名的元素将具有零值,而其他元素对应于以上值
发布于 2011-04-09 01:44:24
以下是一种工作方式:
inputs <- letters[1:4]
combs <- combn(inputs, 2)
N <- seq_len(ncol(combs))
nams <- unique(as.vector(combs))
out <- matrix(ncol = length(nams), nrow = length(nams))
out[lower.tri(out)] <- N
out <- t(out)
out[lower.tri(out)] <- N
out <- t(out)
diag(out) <- 0
rownames(out) <- colnames(out) <- inputs这就给出了:
> out
a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0如果我不得不经常这样做,我会将这些函数调用封装到一个函数中。
另一种选择是通过手动设置"dist"对象,使用as.matrix.dist()为我们完成转换。使用前面的一些对象:
## Far easier
out2 <- N
class(out2) <- "dist"
attr(out2, "Labels") <- as.character(inputs)
attr(out2, "Size") <- length(inputs)
attr(out2, "Diag") <- attr(out2, "Upper") <- FALSE
out2 <- as.matrix(out2)这就给出了:
> out2
a b c d
a 0 1 2 3
b 1 0 4 5
c 2 4 0 6
d 3 5 6 0同样,如果我必须多次执行此操作,我会将其封装在一个函数中。
发布于 2011-04-09 00:59:31
它必须是对角线上有零的镜像矩阵吗?
combo <- combn(letters[1:4], 2)
in.combo <- matrix(1:6, nrow = 1)
combo <- rbind(combo, in.combo)
out.combo <- matrix(rep(NA, 16), ncol = 4)
colnames(out.combo) <- letters[1:4]
rownames(out.combo) <- letters[1:4]
for(cols in 1:ncol(combo)) {
vec1 <- combo[, cols]
out.combo[vec1[1], vec1[2]] <- as.numeric(vec1[3])
}
> out.combo
a b c d
a NA 1 2 3
b NA NA 4 5
c NA NA NA 6
d NA NA NA NAhttps://stackoverflow.com/questions/5598000
复制相似问题