2014-02-03 2 views
1

Ситуация:ddply применять функцию на данных по группам

Вот данные у меня есть:

> head(data1) 
    CHROM POS REF ALT DIFF GT 
1 chr01 14653 C T 254 CT  
2 chr01 14907 A G 254 AG  
3 chr01 14930 A G 23 AG  
4 chr01 15190 G A 260 GA  
5 chr01 15211 T G 21 TG  
6 chr01 16378 T C 1167 TC  

> tail(data1) 
154176 chrX 154901366 T A 58700 TA  
154177 chrX 154901404 A T 38 AT  
154178 chrX 154933406 A G 32002 AG  
154179 chrX 154933419 A T 13 AT  
154180 chrX 154933451 T C 32 TC  
154181 chrX 154933473 G T 22 GT  
  • CHROM имеет категорическое значение от chr01 до chr22 плюс chrX (всего 23)
  • GT категоричен (сочетание двух из ACGT) (в общей сложности 12 возможностей)

Что я хочу сделать:

  1. Group POS по 1e7. Я сделал это с помощью data1 $ POSgroup < - пол (data1 $ POS/1e7)
  2. вычислить среднее значение для каждого POSgroup и CHROM группы. Поэтому у меня должно быть общее количество значений #POSgroup * # CHROM в качестве набора данных.

Код, который у меня есть, теперь может получать только среднее значение, сгруппированное группой POS, но не группой CHROM.

Код:

datsum <- ddply(data1, .var = "POSgroup", .fun = function(x) { 

    # Calculate the mean DIFF value for each GT group in this POSgroup 
    meandiff <- ddply(x, .var = "GT", .fun = summarise, ymean = mean(DIFF)) 

    # Add the center of the POSgroup range as the x position 
    meandiff$center <- (x$POSgroup[1] * 1e7) + 0.5e7 

    # Return the results 
    meandiff 

}) 

Может кто-нибудь помочь мне с этим?

ответ

3

Использование data.table, это даст вам отправную точку:

library(data.table) 
dt = data.table(data1) 

dt[, mean(DIFF), by = list(floor(CHROM/1e7), floor(POS/1e7))] 
+0

Это работает. У меня есть дополнительный вопрос. Не могли бы вы взглянуть на этот пост? http://stackoverflow.com/questions/21532790/r-ggplot-separate-mean-by-range-of-x-value/21536008?noredirect1_comment32522803_21536008 и рассмотрите решение, данное Мэттом Паркером. Я попытался вписаться в это решение, но не смог, не могли бы вы это понять? Спасибо. Этот сюжет - именно то, что я хотел, просто группа chr *, как сюжет в: http: //stackoverflow.com/questions/21489385/r-running-average-for-non-time-data. Спасибо! –

+0

@YilunZhang Я предлагаю добавить еще один вопрос, где вы объясните, что вы хотите, что вы пробовали и что не сработало – eddi

+0

Привет, я проработал! Спасибо, в любом случае! –

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