2017-06-09 26 views
-1

私はRが初めてで、助けが必要です。私は、患者のサンプルが異なる巨大なデータフレームを持っています。各患者は24 'クロムを有する。各「クロム」には3つのセグメントがあります。以下は患者 'A2461'の例です。以下は、私が持っているデータの一部の例です。Rプログラミングを使用してデータフレームの平均を計算する

 ID chrom loc.start loc.end num.mark seg.mean seg.sd seg.median seg.mad 
1 A2461  1  61735 23342732 13103 0.0314 0.4757  0.0221 0.4811 
2 A2461  1 23345569 54962669 17435 -0.0103 0.4807 -0.0292 0.4821 
3 A2461  1 54963958 55075062  57 0.4841 0.4070  0.5201 0.3519 
1 A2461  2  12784 17248573 13037 -0.0037 0.4643 -0.0053 0.4583 
2 A2461  2 17248890 85480817 45819 -0.0331 0.4667 -0.0352 0.4635 
3 A2461  2 85481399 89121495  1626 0.0153 0.4727  0.0000 0.4617 

私は現在、次のコードを使用することにより、総平均を持っている:

seg_mean <- df$seg.mean 
mean(seg_mean) 

をしかし、私は「ワンセグの平均値を計算したいと思います各染色体ごとに「.mean」を付けて、患者IDとクロムを明らかにする出​​力を得る。だからおそらく...

ID chrom seg.mean 
A2461  1  0.1684 
A2461  2 -0.0072 

何か助けていただければ幸いです。読んでくれてありがとう。

+0

[この回答](https://stackoverflow.com/questions/21982987/mean-per-group-in-a-data-frame)が役立つ可能性があります。 [またはこの1つ](https://stackoverflow.com/questions/9723208/aggregate-summarize-multiple-variables-per-group-i-e-sum-mean-etc) –

+1

'集約(.ID、データ= df、平均)' – Masoud

答えて

4
require(dplyr) 

seg_mean <- df %>% group_by(ID, chrom) %>% summarise(seg.mean = mean(seg.mean)) 
+0

これを関数として書く方法について提案はありますか?私はこれをさまざまな患者に実装したいと思います。おそらく100人以上の患者がいる大きなデータセットを持っているのでループを作成しています。 –

+0

関数 'myfunc < - function(x){}'で何かをラップすることはできますが、上記のものは異なる患者のためのものだと思いました。だから私はあなたが探しているものが正確ではない。 – ssp3nc3r

5

あなたは基本-Rの機能を使用することができます。

aggregate(.~ ID + chrom, data=df, mean) 

これはあなたを与える:

#  ID chrom loc.start loc.end num.mark  seg.mean seg.sd seg.median seg.mad 
# 1 A2461  1 26123754 44460154 10198.33 0.168400000 0.4544667  0.1710 0.4383667 
# 2 A2461  2 34247691 63950295 20160.67 -0.007166667 0.4679000 -0.0135 0.4611667 

たり、seg.meanの平均値のみを取得するために選択することができます。

aggregate(.~ ID + chrom, data=df, mean)[,c("ID", "chrom","seg.mean")] 

#  ID chrom  seg.mean 
# 1 A2461  1 0.168400000 
# 2 A2461  2 -0.007166667 

データ

df <- structure(list(ID = c("A2461", "A2461", "A2461", "A2461", "A2461", 
    "A2461"), chrom = c(1L, 1L, 1L, 2L, 2L, 2L), loc.start = c(61735L, 
    23345569L, 54963958L, 12784L, 17248890L, 85481399L), loc.end = c(23342732L, 
    54962669L, 55075062L, 17248573L, 85480817L, 89121495L), num.mark = c(13103L, 
    17435L, 57L, 13037L, 45819L, 1626L), seg.mean = c(0.0314, -0.0103, 
    0.4841, -0.0037, -0.0331, 0.0153), seg.sd = c(0.4757, 0.4807, 
    0.407, 0.4643, 0.4667, 0.4727), seg.median = c(0.0221, -0.0292, 
    0.5201, -0.0053, -0.0352, 0), seg.mad = c(0.4811, 0.4821, 0.3519, 
    0.4583, 0.4635, 0.4617)), .Names = c("ID", "chrom", "loc.start", 
    "loc.end", "num.mark", "seg.mean", "seg.sd", "seg.median", "seg.mad" 
    ), row.names = c(NA, -6L), class = "data.frame") 
1

Masoud'sソリューションのほんの少し修正。

aggregate(seg.mean~ID+chrom , df , mean) 
関連する問題