2016-04-03 10 views
1

Sagen, ich habe diesen Datenrahmen:Convert Spalte 2 in Datenrahmen abgeschlossen Binärmatrix

 id time 
1  A  1 
2  D  1 
3  E  3 
4  H  1 
5  I  4 
6  J  3 
7  L  4 
8  M  5 
9  N  6 
10  O  5 
11  P  6 
12  Q  7 
13  R  7 
14  S  2 
15  T  6 
16  U  8 
17  V  4 
18  W  2 

Ich mag mit 8 Reihen dieses in eine binäre Matrix umzuwandeln, und 18 Spalten (die Anzahl der IDs in dem Datenrahmen). Die Matrix sollte mit allen Nullen beginnen. Der Wert in 'Zeit' bezieht sich auf die erste Zeile, in der für jede Spalte eine '1' erscheinen kann (die Reihenfolge des Buchstabens bezieht sich auf die Nummer der Spalte, also in diesem Fall A = 1, D = 2, H = 4 usw.). Nachdem eine 1 in einer Spalte erschienen ist, sollte sie automatisch bis Zeile 8 gefüllt werden.

Ich kam mit diesem unhandlichen Code, der funktioniert, aber es beinhaltet eine Schleife und ich muss denken, dass mir ein mehr fehlt elegante Lösung.

tmp1 <- unlist(tmp$time) 
out <- matrix(0, nrow(tmp), 8) 
for(i in 1:nrow(tmp)){ out[i,tmp1[i]]<-1} 
out <- apply(out,1,cumsum) 

    [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12] [,13] [,14] [,15] [,16] [,17] [,18] 
[1,] 1 1 0 1 0 0 0 0 0  0  0  0  0  0  0  0  0  0 
[2,] 1 1 0 1 0 0 0 0 0  0  0  0  0  1  0  0  0  1 
[3,] 1 1 1 1 0 1 0 0 0  0  0  0  0  1  0  0  0  1 
[4,] 1 1 1 1 1 1 1 0 0  0  0  0  0  1  0  0  1  1 
[5,] 1 1 1 1 1 1 1 1 0  1  0  0  0  1  0  0  1  1 
[6,] 1 1 1 1 1 1 1 1 1  1  1  0  0  1  1  0  1  1 
[7,] 1 1 1 1 1 1 1 1 1  1  1  1  1  1  1  0  1  1 
[8,] 1 1 1 1 1 1 1 1 1  1  1  1  1  1  1  1  1  1 

Antwort

2

Ihre Daten:

tmp <- data.frame(id = c("A", "D", "E", "H", "I", "J", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W"), 
        time = c(1L, 1L, 3L, 1L, 4L, 3L, 4L, 5L, 6L, 5L, 6L, 7L, 7L, 2L, 6L, 8L, 4L, 2L), 
        stringsAsFactors = FALSE) 

Etwas einfacher:

out2 <- sapply(tmp$time, function(i) c(rep(0, i-1), rep(1,8-i+1))) 

das ist identisch mit Ihrer Ausgabe (und ein wenig schneller).

1

Hier ist ein Ansatz meiner mtabulate von qdapTools singen:

library(qdapTools) 
t(mtabulate(lapply(split(dat$time, dat$id), `:`, length(unique(dat$time))))) 

## A D E H I J L M N O P Q R S T U V W 
## 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
## 2 1 1 0 1 0 0 0 0 0 0 0 0 0 1 0 0 0 1 
## 3 1 1 1 1 0 1 0 0 0 0 0 0 0 1 0 0 0 1 
## 4 1 1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 
## 5 1 1 1 1 1 1 1 1 0 1 0 0 0 1 0 0 1 1 
## 6 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 0 1 1 
## 7 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 
## 8 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 
Verwandte Themen