2015-01-22 4 views
2

У меня есть данные, что выглядит следующим образом:dcast с пользовательскими fun.aggregate

sample start end gene coverage 
X  1  10 A 5 
X  11 20 A 10 
Y  1  10 A 5 
Y  11 20 A 10 
X  1  10 B 5 
X  11 20 B 10 
Y  1  10 B 5 
Y  11 20 B 10 

Я добавил дополнительные колонки:

data$length <- (data$end - data$start + 1) 

data$ct_lt <- (data$length * data$coverage) 

Я reformated мои данные с помощью dcast:

casted <- dcast(data, gene ~ sample, value.var = "coverage", fun.aggregate = mean) 

Таким образом, мои новые данные выглядят так:

gene X  Y 
A  10.00000 10.00000 
B  38.33333 38.33333 

Это правильный формат данных, который я желаю, но хотел бы, чтобы fun.aggregate по-разному. Вместо этого, я хотел бы принять взвешенное среднее, с покрытием, взвешенных по длине:

(сумма (ct_lt))/(сумма (длина))

Как идти об этом?

ответ

1

Disclosure: нет R передо мной, но я думаю, что ваш друг здесь может быть пакетом dplyr и tidyr.

Конечно много способов для достижения этой цели, но я думаю, что следующий могут вы начали

library(dplyr) 
library(tidyr) 

data %>% 
select(gene, sample, ct_lt, length) %>% 
group_by(gene, sample) %>% 
summarise(weight_avg = sum(ct_lt)/sum(length)) %>% 
spread(sample, weight_avg) 

Надеются, что это помогает ...

+0

спасибо, это была большая помощь. – RedPandaSpaceOdyssey

Смежные вопросы