根据 data.frame 的分组计算统计数据
Compute statistics based on grouping of data.frame
我有以下 data.frame 我想计算一些统计数据:
gene_symbol signal_window signal_score MEF_chRNA ES_chRNA signal_dist_to_gene
262764 GOT1 218220 0.08 0.2696089 0.3356937140 44805
403001 NKX2 218220 0.08 0.0000000 0.0008852885 42915
262630 GOT1 218221 0.08 0.2696089 0.3356937140 45005
403039 NKX2 218221 0.08 0.0000000 0.0008852885 42715
262793 GOT1 218222 0.00 0.2696089 0.3356937140 45205
402663 NKX2 218222 0.00 0.0000000 0.0008852885 42515
262867 GOT1 218223 0.16 0.2696089 0.3356937140 45405
402737 NKX2 218223 0.16 0.0000000 0.0008852885 42315
262677 GOT1 218224 0.16 0.2696089 0.3356937140 45605
403006 NKX2 218224 0.16 0.0000000 0.0008852885 42115
262858 GOT1 218225 0.16 0.2696089 0.3356937140 45805
402953 NKX2 218225 0.16 0.0000000 0.0008852885 41915
如示例 data.frame 所示,每个 signal_window
可以有多个 gene_symbol
值。现在,对于每个 signal_window
中的每个 gene_symbol
,我想计算 1/signal_dist_to_gene
。我想使用此值计算每个 signal_window
中每个 gene_symbol
的每个 1/signal_dist_to_gene
的总和。
例如,window 218220 有两个基因。对于我要计算的每个基因:
gene_weight_GOT1 = (1/signal_dist_to_gene_GOT1) / (1/signal_dist_to_gene_GOT1 + 1/signal_dist_to_gene_NKX2)
gene_weight_NKX2 = (1/signal_dist_to_gene_NKX2) / (1/signal_dist_to_gene_GOT1 + 1/signal_dist_to_gene_NKX2)
我最终想使用这些 gene_weight
变量来计算:
MEF_prop = [MEF_chRNA_GOT1 * gene_weight_GOT1 * 1/2 + MEF_chRNA_NKX2 * gene_weight_NKX2 * 1/2] / [gene_weight_GOT1 * (MEF_chRNA_GOT1/2 + ES_chRNA_GOT1/2) + gene_weight_NKX2 * (MEF_chRNA_NKX2/2 + ES_chRNA_NKX2/2)]
不能保证同一个 window 中总会有 2 个基因。有些情况下没有基因 (NA),有些情况下有 20 多个基因。 有没有使用 plyr 或 dplyr 计算这个的简单方法?
这应该可以做到。首先我们按 signal_window 分组,然后按照您指定的方式计算权重。分母中的sum
是在组(signal_window)
上计算的
library(tidyverse)
df %>%
group_by(signal_window) %>%
mutate(gene_weight = (1 / signal_dist_to_gene) / sum(1/signal_dist_to_gene))
标准 dplyr 语法 data.df %>% group_by() %>% mutate()
应该非常简单明了。
您的代码最终可能看起来像这样:
data.df %>%
group_by(signal_window, gene_symbol) %>%
mutate(gene_weight = (1/signal_dist_to_gene) / sum(1/signal_dist_to_gene)) %>%
mutate(MEF_prop = (MEF_chRNA * gene_weight * 1/2 + MEF_chRNA * gene_weight * 1/2) / (gene_weight * (MEF_chRNA/2 + ES_chRNA/2) + gene_weight * (MEF_chRNA/2 + ES_chRNA/2)))
如果您希望每个重复符号在 signal_window
中得到唯一处理,您可以从 group_by
中删除 gene_symbol
,或者如果您希望它们分组,则保留它。
这就是你想要的吗?
我有以下 data.frame 我想计算一些统计数据:
gene_symbol signal_window signal_score MEF_chRNA ES_chRNA signal_dist_to_gene
262764 GOT1 218220 0.08 0.2696089 0.3356937140 44805
403001 NKX2 218220 0.08 0.0000000 0.0008852885 42915
262630 GOT1 218221 0.08 0.2696089 0.3356937140 45005
403039 NKX2 218221 0.08 0.0000000 0.0008852885 42715
262793 GOT1 218222 0.00 0.2696089 0.3356937140 45205
402663 NKX2 218222 0.00 0.0000000 0.0008852885 42515
262867 GOT1 218223 0.16 0.2696089 0.3356937140 45405
402737 NKX2 218223 0.16 0.0000000 0.0008852885 42315
262677 GOT1 218224 0.16 0.2696089 0.3356937140 45605
403006 NKX2 218224 0.16 0.0000000 0.0008852885 42115
262858 GOT1 218225 0.16 0.2696089 0.3356937140 45805
402953 NKX2 218225 0.16 0.0000000 0.0008852885 41915
如示例 data.frame 所示,每个 signal_window
可以有多个 gene_symbol
值。现在,对于每个 signal_window
中的每个 gene_symbol
,我想计算 1/signal_dist_to_gene
。我想使用此值计算每个 signal_window
中每个 gene_symbol
的每个 1/signal_dist_to_gene
的总和。
例如,window 218220 有两个基因。对于我要计算的每个基因:
gene_weight_GOT1 = (1/signal_dist_to_gene_GOT1) / (1/signal_dist_to_gene_GOT1 + 1/signal_dist_to_gene_NKX2)
gene_weight_NKX2 = (1/signal_dist_to_gene_NKX2) / (1/signal_dist_to_gene_GOT1 + 1/signal_dist_to_gene_NKX2)
我最终想使用这些 gene_weight
变量来计算:
MEF_prop = [MEF_chRNA_GOT1 * gene_weight_GOT1 * 1/2 + MEF_chRNA_NKX2 * gene_weight_NKX2 * 1/2] / [gene_weight_GOT1 * (MEF_chRNA_GOT1/2 + ES_chRNA_GOT1/2) + gene_weight_NKX2 * (MEF_chRNA_NKX2/2 + ES_chRNA_NKX2/2)]
不能保证同一个 window 中总会有 2 个基因。有些情况下没有基因 (NA),有些情况下有 20 多个基因。 有没有使用 plyr 或 dplyr 计算这个的简单方法?
这应该可以做到。首先我们按 signal_window 分组,然后按照您指定的方式计算权重。分母中的sum
是在组(signal_window)
library(tidyverse)
df %>%
group_by(signal_window) %>%
mutate(gene_weight = (1 / signal_dist_to_gene) / sum(1/signal_dist_to_gene))
标准 dplyr 语法 data.df %>% group_by() %>% mutate()
应该非常简单明了。
您的代码最终可能看起来像这样:
data.df %>%
group_by(signal_window, gene_symbol) %>%
mutate(gene_weight = (1/signal_dist_to_gene) / sum(1/signal_dist_to_gene)) %>%
mutate(MEF_prop = (MEF_chRNA * gene_weight * 1/2 + MEF_chRNA * gene_weight * 1/2) / (gene_weight * (MEF_chRNA/2 + ES_chRNA/2) + gene_weight * (MEF_chRNA/2 + ES_chRNA/2)))
如果您希望每个重复符号在 signal_window
中得到唯一处理,您可以从 group_by
中删除 gene_symbol
,或者如果您希望它们分组,则保留它。
这就是你想要的吗?