2015-04-13 27 views
5

mam data.table w RPrzekształcanie tabeli danych, aby nazwy kolumn do nazw wierszy

> dt 
    SAMPLE junction count 
1: R1  a  1 
2: R2  a  1 
3: R3  b  1 
4: R3  a  1 
5: R1  c  2 

Teraz chcę „przekształcenia” tabelę danych w celu utworzenia data framem (w zasadzie skrzyżowanie od matrycy próbki z wartością indeksu być odpowiednią wartością licznika). Należy również zauważyć, że dla par (SAMPLE,junction), które nie istnieją w dt, zakładam, że odpowiednia wartość count to zero. Czy ktoś może mi pomóc, jak to osiągnąć?

> m 
     R1 R2 R3 
    a 1 1 1 
    b 0 0 1 
    c 2 0 0 

Odpowiedz

11

The dcast z data.table zmienia zestaw danych z 'długi' w formacie szerokim.

library(data.table)#v1.9.5+ 
dcast(dt, junction~SAMPLE, value.var='count', fill=0) 
# junction R1 R2 R3 
#1:  a 1 1 1 
#2:  b 0 0 1 
#3:  c 2 0 0 

Jeśli potrzebujesz wyjście matrycy

library(reshape2) 
acast(dt, junction~SAMPLE, value.var='count', fill=0) 
# R1 R2 R3 
#a 1 1 1 
#b 0 0 1 
#c 2 0 0 

Albo xtabs z base R

xtabs(count~junction+SAMPLE, dt) 
5

Alternatywnym podejściem korzystając spread z tidyr:

library(tidyr) 

spread(dt, SAMPLE, count, fill=0) 
# junction R1 R2 R3 
#1:  a 1 1 1 
#2:  b 0 0 1 
#3:  c 2 0 0 

Albo stare rozwiązanie szkoła z reshape z stats:

reshape(dt, timevar='SAMPLE', idvar=c('junction'), direction='wide') 
# junction count.R1 count.R2 count.R3 
#1:  a  1  1  1 
#2:  b  NA  NA  1 
#3:  c  2  NA  NA 

danych:

dt = structure(list(SAMPLE = c("R1", "R2", "R3", "R3", "R1"), junction = c("a", 
"a", "b", "a", "c"), count = c(1, 1, 1, 1, 2)), .Names = c("SAMPLE", 
"junction", "count"), row.names = c(NA, -5L), class = c("data.table", 
"data.frame"), .internal.selfref = <pointer: 0x05e924a0>)