我在R中有一个数据集,如下所示:
ID LinkedTo
1 Null
2 1
3 1
4 3
5 4
我希望将其转换为类似于此的矩阵:
0 0 0 0 0
1 0 0 0 0
1 0 0 0 0
0 0 1 0 0
0 0 0 1 0
答案 0 :(得分:1)
另一种选择是将有向数据集建模为有向图并提取邻接矩阵。
library(igraph)
dat <- read.table(text='ID LinkedTo
2 1
3 1
4 3
5 4',header=TRUE)
gg <- graph.data.frame(dat)
as.matrix(get.adjacency(gg))
2 3 4 5 1
2 0 0 0 0 1
3 0 0 0 0 1
4 0 1 0 0 0
5 0 0 1 0 0
1 0 0 0 0 0
答案 1 :(得分:0)
如果在数据集中将NA替换为“Null”,则会更方便。像
这样的东西i <- structure(list(ID = c(1, 2, 3, 4, 5),
LinkedTo = c(NA, 1, 1, 3, 4)),
.Names = c("ID", "LinkedTo"),
row.names = c(NA, -5L), class = "data.frame")
i
# ID LinkedTo
# 1 1 NA
# 2 2 1
# 3 3 1
# 4 4 3
# 5 5 4
然后你可以做
m <- matrix(0, nrow(i), nrow(i))
m[i$ID + (i$LinkedTo - 1) * nrow(i)] <- 1
(如果i
是矩阵,它的工作方式相同,但您必须将i$ID
和i$LinkedTo
更改为i[, 1]
和i[, 2]
resp )
答案 2 :(得分:0)
你可以先用零替换null,我想。 然后你可以做一点循环:
data.frame(id=1:5, pos=sample(1:5))->df
matrix(nrow=max(nrow(df)),ncol= max(df$id),data=0)->m
for (i in 1:nrow(df)){
m[i,df$pos[i]]<-1
}
答案 3 :(得分:0)
使用@konvas i
数据集
i[,2][is.na(i[,2])] <- 0
m <- matrix(0, nrow(i), nrow(i))
m[as.matrix(i)] <- 1
m
# [,1] [,2] [,3] [,4] [,5]
#[1,] 0 0 0 0 0
#[2,] 1 0 0 0 0
#[3,] 1 0 0 0 0
#[4,] 0 0 1 0 0
#[5,] 0 0 0 1 0
答案 4 :(得分:0)
table
如果将其与factor
结合使用也应该有用。 (我说&#34;应该&#34;因为你的条件没有明确规定,你的样本数据不可复制。)
使用@ konvas&#34; i&#34;示例数据,请尝试:
> table(i$ID, factor(i$LinkedTo, 1:5))
1 2 3 4 5
1 0 0 0 0 0
2 1 0 0 0 0
3 1 0 0 0 0
4 0 0 1 0 0
5 0 0 0 1 0