2015-07-29 2 views
2

У меня есть таблица данных, и я стараюсь Перестройка, но она не работает, как я могу это сделать:Reshape dataframe и создать подобие матрицы

У меня есть таблица данных:

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 
+1

Объекты данных R не имеют этих разделителей. Так это действительно data.table (это конкретное имя специального типа объекта), или это кадр данных или это просто текстовый файл? –

+0

это dataframe –

ответ

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 
+0

Хорошо, но скажу, что у меня было 1000 строк, и каждое имя имело 100 значений. Как я могу это сделать? Я не мог перечислить каждую строку и каждое значение в столбце –

+0

@SanthoshSubramanian Тот же самый точный код работает с фреймом данных. Это только я вводил ваши образцы данных. –

+0

данные <-list (bob = c (8,9,10), mike = c (2,3,4), sandr = c (5,6,7)) as.data.frame (data) Что является точкой этого шага. Когда я делаю данные <- list (dataframe), тогда as.data.frame (dataframe), я получаю то же самое –

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 
Смежные вопросы