我有一个数据表,我尝试重塑它但它不起作用,我该怎么做:
我有一个数据表:
Name | Value
-------------
Bob | 8,9,10
------------
Mike | 2,3,4
------------
Sandr| 5,6,7
如何将其变为如下列表:
Value | Name
-------------
2 | Mike
3 | Mike
4 | Mike
5 | Sandr
6 | Sandr
7 | Sandr
8 | Bob
9 | Bob
10 | Bob
然后将此列表设为如下矩阵:
2 3 4 5 6 7 8 9 10
-------------------
2 | 1 1 1 0 0 0 0 0 0
3 | 1 1 1 0 0 0 0 0 0
4 | 1 1 1 0 0 0 0 0 0
5 | 0 0 0 1 1 1 0 0 0
6 | 0 0 0 1 1 1 0 0 0
7 | 0 0 0 1 1 1 0 0 0
8 | 0 0 0 0 0 0 1 1 1
9 | 0 0 0 0 0 0 1 1 1
10| 0 0 0 0 0 0 1 1 1
答案 0 :(得分:6)
您要查找的功能是stack
和contrasts
。
data<-list(bob=c(8,9,10),mike=c(2,3,4),sandr=c(5,6,7))
as.data.frame(data)
bob mike sandr 1 8 2 5 2 9 3 6 3 10 4 7
stack(data)
values ind 1 8 bob 2 9 bob 3 10 bob 4 2 mike 5 3 mike 6 4 mike 7 5 sandr 8 6 sandr 9 7 sandr
df<-stack(data)
contrasts(df$ind,contrasts=FALSE)[df$ind,df$ind]
bob bob bob mike mike mike sandr sandr sandr bob 1 1 1 0 0 0 0 0 0 bob 1 1 1 0 0 0 0 0 0 bob 1 1 1 0 0 0 0 0 0 mike 0 0 0 1 1 1 0 0 0 mike 0 0 0 1 1 1 0 0 0 mike 0 0 0 1 1 1 0 0 0 sandr 0 0 0 0 0 0 1 1 1 sandr 0 0 0 0 0 0 1 1 1 sandr 0 0 0 0 0 0 1 1 1
您可以指定行名称和列名称,并根据需要进行排序
im<-contrasts(df$ind,contrasts=FALSE)[df$ind,df$ind]
rownames(im)<-df$values
colnames(im)<-df$values
答案 1 :(得分:1)
res <- read.table(text="Name | Value
Bob | 8,9,10
Mike | 2,3,4
Sandr| 5,6,7", header=TRUE, sep="|")
dres <- data.frame(Value= unlist( strsplit(as.character(res$Value), ",") )
, Name=rep(res$Name, each=3))
dres <- dres[order(as.numeric(as.character(dres$Value))), ]
dres
outer(sort(dres$Value), sort(dres$Value), FUN=function(x,y) dres[x, "Name"] == dres[y,"Name"] )
[,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9]
[1,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[2,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[3,] TRUE TRUE TRUE FALSE FALSE FALSE FALSE FALSE FALSE
[4,] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE
[5,] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE
[6,] FALSE FALSE FALSE TRUE TRUE TRUE FALSE FALSE FALSE
[7,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
[8,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE
[9,] FALSE FALSE FALSE FALSE FALSE FALSE TRUE TRUE TRUE