2017-06-09 65 views
-1

我是R新手,需要一些幫助。我有一個龐大的數據框與不同的患者樣本。每名患者有24'chrom。每個'鉻'有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和chrom。所以也許類似...

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

任何幫助將不勝感激!謝謝閱讀。

+0

[This answer](https://stackoverflow.com/questions/21982987/mean-per-group-in-a-data-frame)可能會有所幫助。 [或者這個](https://stackoverflow.com/questions/9723208/aggregate-summarize-multiple-variables-per-group-i-e-sum-mean-etc)。 –

+1

'aggregate(。〜ID,data = df,mean)' – Masoud

回答

4
require(dplyr) 

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

對於如何將此函數作爲函數進行編寫,您有任何建議嗎?我希望在不同的患者身上實現這一點,也許會形成一個循環,因爲我有一個擁有100多名患者的大數據集。 –

+0

你可以在函數'myfunc < - function(x){}'中包裝任何東西,但我認爲以上是針對不同的患者:'ID'。所以我不確定你在找什麼。 – 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)