重塑数据框并创建相似度矩阵

时间:2015-07-29 18:11:11

标签: r

我有一个数据表,我尝试重塑它但它不起作用,我该怎么做:

我有一个数据表:

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 

2 个答案:

答案 0 :(得分:6)

您要查找的功能是stackcontrasts

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