R中的覆盖矩阵

时间:2017-07-03 17:49:10

标签: r matrix

我想在R中生成一个覆盖矩阵 我有这个矩阵

V1    V2
3     2
3     4
3   419
3   422
2     0
2     3
4     3
4     5
4    98
4   420
419     3
419   420
419 35698

我希望生成以下内容

        0 2 3 4 5 98 419 420 422 35698
0       0 1 0 0 0 0   0   0   0    0
2       1 0 1 0 0 0   0   0   0    0
3       0 1 0 1 0 0   1   0   1    0
4       0 0 1 0 1 1   0   1   0    0
5       0 0 0 1 0 0   0   0   0    0
98      0 0 0 1 0 0   0   0   0    0
419     0 0 1 0 0 0   0   1   0    1
420     0 0 0 1 0 0   1   0   0    0
422     0 0 1 0 0 0   0   0   0    0
35698   0 0 0 0 0 0   1   0   0    0

任何想法?

2 个答案:

答案 0 :(得分:3)

您可以使用xtabs

执行此操作
m <- xtabs(~c(df$V1,df$V2) + c(df$V2,df$V1))
m[m>1] <- 1 #otherwise there will be some 2s

m
               c(df$V2, df$V1)
c(df$V1, df$V2) 0 2 3 4 5 98 419 420 422 35698
          0     0 1 0 0 0  0   0   0   0     0
          2     1 0 1 0 0  0   0   0   0     0
          3     0 1 0 1 0  0   1   0   1     0
          4     0 0 1 0 1  1   0   1   0     0
          5     0 0 0 1 0  0   0   0   0     0
          98    0 0 0 1 0  0   0   0   0     0
          419   0 0 1 0 0  0   0   1   0     1
          420   0 0 0 1 0  0   1   0   0     0
          422   0 0 1 0 0  0   0   0   0     0
          35698 0 0 0 0 0  0   1   0   0     0

答案 1 :(得分:0)

这是基于R的方法,使用矩阵子集。我假设你的第一个对象是data.frame,而不是矩阵。

# get row and column names
myNames <- sort(unique(unlist(mydf)))

# build matrix of 0s with the desired dimensions
result <- matrix(0, length(myNames), length(myNames), dimnames = list(myNames, myNames))

# get row-column names to fill in matrix, for half of matrix
filler <- matrix(as.character(unlist(mydf)), ncol=2)

# fill in ones using matrix subsetting
result[rbind(filler, t(apply(filler, 1, rev)))] <- 1

通过取消列出data.frame的内容,将结果向量转换为字符向量,然后使用内容构建字符元素矩阵来创建子集矩阵。这些元素引用结果矩阵的行名和列名来执行子集化。 applyrev用于构建对称索引集,以填充矩阵的另一半。

返回

result
      0 2 3 4 5 98 419 420 422 35698
0     0 1 0 0 0  0   0   0   0     0
2     1 0 1 0 0  0   0   0   0     0
3     0 1 0 1 0  0   1   0   1     0
4     0 0 1 0 1  1   0   1   0     0
5     0 0 0 1 0  0   0   0   0     0
98    0 0 0 1 0  0   0   0   0     0
419   0 0 1 0 0  0   0   1   0     1
420   0 0 0 1 0  0   1   0   0     0
422   0 0 1 0 0  0   0   0   0     0
35698 0 0 0 0 0  0   1   0   0     0

数据

mydf <-
structure(list(V1 = c(3L, 3L, 3L, 3L, 2L, 2L, 4L, 4L, 4L, 4L, 
419L, 419L, 419L), V2 = c(2L, 4L, 419L, 422L, 0L, 3L, 3L, 5L, 
98L, 420L, 3L, 420L, 35698L)), .Names = c("V1", "V2"), class = "data.frame",
row.names = c(NA, -13L))