2015-04-13 4 views
5

У меня есть data.table в RПерестройка таблицы данных, чтобы имена столбцов в имена строк

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

Теперь я хочу, чтобы «изменить» таблицу данных для формирования data framem (в основном соединения по матрице образца со значением индекса для соответствующего значения счета). Также обратите внимание, что для (SAMPLE,junction) пар, которых нет в dt, я принимаю соответствующее значение count равным zero. Может ли кто-нибудь помочь мне, как этого достичь?

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

ответ

11

The dcast из data.table изменяет набор данных из 'длинных' в формат 'широкий'.

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 

Если вам нужен выход матрицы

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 

Или xtabs из base R

xtabs(count~junction+SAMPLE, dt) 
5

Альтернативный подход с использованием spread из 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 

Или старое решение школы с reshape от 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 

данных:

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