2017-06-19 127 views
2

我有以下data.frame:如何計算R中的加權和?

A1 A2 EFF  FRQ  G1 G2 
A G 0.0125 0.4578 A G 
T C 0.0143 0.1293 C C 
T C -0.017 0.8984 T T 
A G -0.018 0.8945 A G 
A G -0.009 0.8652 A A 
A G 0.0001 0.3931 G G 

的影響(EFF)和頻率(FRQ)是相對於A1。我想計算我的G1和G2的總和效果。例如,在第一行中,如果G1 = A1,則其效果爲0.0125。但是,如果G1 = A2,那麼我想翻轉效果的符號並將其設爲-0.125。如果G2 = A1,我希望G2的效果是0.0125。如果G2 = A2,那麼我希望G2的效果是-0.125。我想創建一個「G1 + G2效果」欄。

在第一行,由於G1 = A2,所以G1的效果是0.0125。由於G2 = A2,G2的效果是-0.0125。因此,在新的「G1 + G2效應」欄中,總和爲0.在第二行中,G1 = A2,因此G1的效應爲-0.0143,G2 = A2,因此G2的效應也爲-0.0143。因此「G1 + G2效應」欄會顯示爲:-0.0286。

這是我希望我的輸出看起來像:

A1 A2 EFF  FRQ  G1 G2 G1+G2_Effects 
    A G 0.0125 0.4578 A G 0 
    T C 0.0143 0.1293 C C -0.0286 
    T C -0.017 0.8984 T T -0.034 
    A G -0.018 0.8945 A G 0 
    A G -0.009 0.8652 A A -0.018 
    A G 0.0001 0.3931 G G -0.0002 

回答

3

基本上你只是計數倍G1的數量或G2匹配A1減去倍G1的數量或G2匹配A2,再乘以該號碼由EFF。在R中可以用算術運算符做到這一點:

dat$G1G2Effect <- with(dat, ((G1==A1) + (G2==A1) - (G1==A2) - (G2==A2))*EFF) 
dat 
# A1 A2  EFF FRQ G1 G2 G1G2Effect 
# 1 A G 0.0125 0.4578 A G  0.0000 
# 2 T C 0.0143 0.1293 C C -0.0286 
# 3 T C -0.0170 0.8984 T T -0.0340 
# 4 A G -0.0180 0.8945 A G  0.0000 
# 5 A G -0.0090 0.8652 A A -0.0180 
# 6 A G 0.0001 0.3931 G G -0.0002 

數據:

dat <- read.table(text="A1 A2 EFF  FRQ  G1 G2 
A G 0.0125 0.4578 A G 
T C 0.0143 0.1293 C C 
T C -0.017 0.8984 T T 
A G -0.018 0.8945 A G 
A G -0.009 0.8652 A A 
A G 0.0001 0.3931 G G", header=TRUE, stringsAsFactors=FALSE) 
1

另一種方法:

zz = ' 
    A1 A2 EFF  FRQ  G1 G2 
    A G 0.0125 0.4578 A G 
    T C 0.0143 0.1293 C C 
    T C -0.017 0.8984 T T 
    A G -0.018 0.8945 A G 
    A G -0.009 0.8652 A A 
    A G 0.0001 0.3931 G G 
    ' 


df$cEFF = NA 
df$cEFF = ifelse(as.character(df$G1) == as.character(df$A1), df$EFF, -df$EFF) + 
      ifelse(as.character(df$G2) == as.character(df$A2), -df$EFF, df$EFF) 

df 

    A1 A2  EFF FRQ G1 G2 cEFF 
1 A G 0.0125 0.4578 A G 0.0000 
2 T C 0.0143 0.1293 C C -0.0286 
3 T C -0.0170 0.8984 T T -0.0340 
4 A G -0.0180 0.8945 A G 0.0000 
5 A G -0.0090 0.8652 A A -0.0180 
6 A G 0.0001 0.3931 G G -0.0002 
1

簡單ifelse條件

> so$t1=ifelse(so$G1==so$A1,so$EFF,-so$EFF)+ifelse(so$G2==so$A1,so$EFF,-so$EFF) 
> so 
    A1 A2  EFF FRQ G1 G2  t1 
1 A G 0.0125 0.4578 A G 0.0000 
2 T C 0.0143 0.1293 C C -0.0286 
3 T C -0.0170 0.8984 T T -0.0340 
4 A G -0.0180 0.8945 A G 0.0000 
5 A G -0.0090 0.8652 A A -0.0180 
6 A G 0.0001 0.3931 G G -0.0002