我想在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
任何想法?
答案 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的内容,将结果向量转换为字符向量,然后使用内容构建字符元素矩阵来创建子集矩阵。这些元素引用结果矩阵的行名和列名来执行子集化。 apply
和rev
用于构建对称索引集,以填充矩阵的另一半。
返回
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))