【发布时间】:2018-06-07 20:24:23
【问题描述】:
我有一个data.frame,它按folder、z_stack_id 分组,并包含每个binary_layer 的计数。 “主要”层是FITC, TRITC, and Cy5。我已经计算了其他地方的交叉点()。我的目标是计算 z_stack 内、文件夹内的比例(如果需要,还可以计算其他分组变量)。我希望使用dplyr::group_by(...) %>% summarise(my_custom_fancy_function)。但我不确定如何制作这样的功能。
函数的预期输出将是每个主层的比例,按文件夹/z_stack_id/(...) 分组。例如,对于Cy5
FITC_Cy5/Cy5、TRITC_Cy5/Cy5、Triple/Cy5
请注意,Triple 并不总是有计数,所以我需要先填充组(目前正在处理它)。
my_df
# A tibble: 13 x 4
folder z_stack_id binary_layer n_blobs
<chr> <dbl> <chr> <int>
1 20180601_122650_896 1.00 Cy5 959
2 20180601_122650_896 1.00 FITC 16
3 20180601_122650_896 1.00 TRITC 499
4 20180601_122650_896 2.00 Cy5 225
5 20180601_122650_896 2.00 FITC 157
6 20180601_122650_896 2.00 TRITC 19
7 20180601_122650_896 1.00 FITC_Cy5 5
8 20180601_122650_896 1.00 FITC_TRITC 2
9 20180601_122650_896 1.00 TRITC_Cy5 301
10 20180601_122650_896 2.00 FITC_Cy5 34
11 20180601_122650_896 2.00 FITC_TRITC 8
12 20180601_122650_896 2.00 Triple 4
13 20180601_122650_896 2.00 TRITC_Cy5 8
dput(my_df)
structure(list(folder = c("20180601_122650_896", "20180601_122650_896",
"20180601_122650_896", "20180601_122650_896", "20180601_122650_896",
"20180601_122650_896", "20180601_122650_896", "20180601_122650_896",
"20180601_122650_896", "20180601_122650_896", "20180601_122650_896",
"20180601_122650_896", "20180601_122650_896"), z_stack_id = c(1,
1, 1, 2, 2, 2, 1, 1, 1, 2, 2, 2, 2), binary_layer = c("Cy5",
"FITC", "TRITC", "Cy5", "FITC", "TRITC", "FITC_Cy5", "FITC_TRITC",
"TRITC_Cy5", "FITC_Cy5", "FITC_TRITC", "Triple", "TRITC_Cy5"),
n_blobs = c(959L, 16L, 499L, 225L, 157L, 19L, 5L, 2L, 301L,
34L, 8L, 4L, 8L)), class = c("tbl_df", "tbl", "data.frame"
), row.names = c(NA, -13L), .Names = c("folder", "z_stack_id",
"binary_layer", "n_blobs"))
更新
我手工做了一个 Cy5 计算的例子。请注意,prop_main_Cy5 列上的大多数结果都是虚假的。唯一有意义的是那些 z_stack_id 的 Cy5 值是总数(例如,FITC_TRITC/Cy5 没有意义)
1 folder z_stack_id binary_layer n_blobs Cy5 prop_main_channel_Cy5
2 20180601_122650_896 1 Cy5 959 959 1
3 20180601_122650_896 1 FITC 16 959 0.016684046
4 20180601_122650_896 1 TRITC 499 959 0.520333681
5 20180601_122650_896 2 Cy5 225 225 1
6 20180601_122650_896 2 FITC 157 225 0.697777778
7 20180601_122650_896 2 TRITC 19 225 0.084444444
8 20180601_122650_896 1 FITC_Cy5 5 959 0.005213764
9 20180601_122650_896 1 FITC_TRITC 2 959 0.002085506
10 20180601_122650_896 1 TRITC_Cy5 301 959 0.313868613
11 20180601_122650_896 2 FITC_Cy5 34 225 0.151111111
12 20180601_122650_896 2 FITC_TRITC 8 225 0.035555556
13 20180601_122650_896 2 Triple 4 225 0.017777778
14 20180601_122650_896 2 TRITC_Cy5 8 225 0.035555556
【问题讨论】:
-
这里回答了一个非常相似的问题:stackoverflow.com/questions/24576515/… 您可以调整该解决方案以适应多个级别的分组。
-
@TTNK 建议的
group_by(folder, z_stack_id) %>% mutate(n/sum(n))替代方案将为我提供整个组的部分。我不明白的是如何计算 within 级别。而不是sum(n)我需要告诉within each factor level combination I want -
@chinsoon12 你的意思是我有我想要的输出的样本吗?
-
是的,您希望使用您在 OP 中提供的数据得到什么输出?
-
@chinsoon12 我是手工制作的,请查看编辑
标签: r dplyr data.table tidyr