如何计算R中的加权和?
How to calculate a weighted sum in R?
我有以下 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 Effects"。
第一行,因为G1 = A2,所以G1的效果是0.0125。由于 G2 = A2,因此 G2 的效果为 -0.0125。因此,在新列 "G1+G2 Effects" 中,总和将为 0。在第二行中,G1 = A2,因此 G1 的效果为 -0.0143,并且 G2 = A2 同样,因此 G2 的效果也为 -0.0143。因此 "G1+G2 Effects" 列将显示为:-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 <- 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)
另一种方法:
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
我有以下 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 Effects"。
第一行,因为G1 = A2,所以G1的效果是0.0125。由于 G2 = A2,因此 G2 的效果为 -0.0125。因此,在新列 "G1+G2 Effects" 中,总和将为 0。在第二行中,G1 = A2,因此 G1 的效果为 -0.0143,并且 G2 = A2 同样,因此 G2 的效果也为 -0.0143。因此 "G1+G2 Effects" 列将显示为:-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 <- 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)
另一种方法:
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