【问题标题】:in R, how to retrieve a complete matrix using combn?在 R 中,如何使用 combn 检索完整的矩阵?
【发布时间】:2011-04-08 16:21:04
【问题描述】:

我的问题,删除特定目的,看起来像这样: 如何转换这样的组合: 先用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

获取元素,例如:第一个元素,从上述dataframe的第一列

那么我如何将上面的数据框转换为矩阵,例如结果,例如:

   a   b   c  d
a  0   1   2  3
b  1   0   4  5
c  2   4   0  6
d  3   5   6  0

具有相同列名和行名的元素将具有零值,而其他元素对应于上述值

【问题讨论】:

  • 不确定你的目标是什么;你需要使用combn()吗?或者 x
  • 数值 1:6 只是一个演示。在实践中,它根据用于索引的组合结果进行计算。

标签: r matrix


【解决方案1】:

这是一种可行的方法:

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

如果我必须经常这样做,我会将这些函数调用包装到一个函数中。

另一种选择是使用as.matrix.dist() 通过手动设置"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

同样,如果我必须多次执行此操作,我会将其包装在一个函数中。

【讨论】:

  • 为什么我们需要做这个操作:attr(out2, "Diag")
  • @Caesar 我们不需要这些属性,但我只是在防御并试图生成一个相当完整的“dist”类对象。如果您不需要这个,请忽略这些步骤;使该特定解决方案更加简单;)
【解决方案2】:

它必须是对角线上有零的镜像矩阵吗?

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 NA

【讨论】:

  • 它仍然可以工作,除了添加几个受第一个答案启发的代码。挖(out.combo)= 0; out.combo[lower.tri(out.combo)] = out.combo[upper.tri(out.combo)];
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-09
  • 2014-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-28
相关资源
最近更新 更多