2017-06-19 128 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