Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何计算R中的加权和?_R_Dataframe_Matching - Fatal编程技术网

如何计算R中的加权和?

如何计算R中的加权和?,r,dataframe,matching,R,Dataframe,Matching,我有以下data.frame: 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 效

我有以下data.frame:

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

基本上你只需要计算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$G1G2Effect另一种方法:

  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

一个简单的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
> 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