【问题标题】:Calculate multi-group row-wise proportion in R计算R中的多组逐行比例
【发布时间】: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) %&gt;% mutate(n/sum(n)) 替代方案将为我提供整个组的部分。我不明白的是如何计算 within 级别。而不是sum(n) 我需要告诉within each factor level combination I want
  • @chinsoon12 你的意思是我有我想要的输出的样本吗?
  • 是的,您希望使用您在 OP 中提供的数据得到什么输出?
  • @chinsoon12 我是手工制作的,请查看编辑

标签: r dplyr data.table tidyr


【解决方案1】:

可能是这样,使用prop.table(),然后使用ungroup() 和group_by 来提高聚合级别?


library(tidyverse)

my_df %>% 
  group_by(folder, z_stack_id) %>% 
  mutate(prop_binary_layer = n_blobs/sum(n_blobs)) %>% 
  ungroup %>% 
  group_by(folder) %>% 
  mutate(prop_z_stack_id = n_blobs/sum(n_blobs))


#> # A tibble: 13 x 6
#> # Groups: folder [1]
#>    folder              z_stack_id binary_layer n_blobs prop_bina~ prop_z_~
#>    <chr>                    <dbl> <chr>          <int>      <dbl>    <dbl>
#>  1 20180601_122650_896       1.00 Cy5              959    0.538   0.429   
#>  2 20180601_122650_896       1.00 FITC              16    0.00898 0.00715 
#>  3 20180601_122650_896       1.00 TRITC            499    0.280   0.223   
#>  4 20180601_122650_896       2.00 Cy5              225    0.495   0.101   
#>  5 20180601_122650_896       2.00 FITC             157    0.345   0.0702  
#>  6 20180601_122650_896       2.00 TRITC             19    0.0418  0.00849 
#>  7 20180601_122650_896       1.00 FITC_Cy5           5    0.00281 0.00224 
#>  8 20180601_122650_896       1.00 FITC_TRITC         2    0.00112 0.000894
#>  9 20180601_122650_896       1.00 TRITC_Cy5        301    0.169   0.135   
#> 10 20180601_122650_896       2.00 FITC_Cy5          34    0.0747  0.0152  
#> 11 20180601_122650_896       2.00 FITC_TRITC         8    0.0176  0.00358 
#> 12 20180601_122650_896       2.00 Triple             4    0.00879 0.00179 
#> 13 20180601_122650_896       2.00 TRITC_Cy5          8    0.0176  0.00358

【讨论】:

  • 这个答案没有产生预期的结果。我永远不需要在分母上使用sum。预期结果示例:对于 z_stack_id == 1 >> TRITC_Cy5/Cy5 = 301/959 = 0.313 ; FITC_Cy5/Cy5 = 5/959 = 0.005;三重/Cy5 = 0/959 = 0
  • 我理解正确吗,FITC_Cy5 是 Cy5 的子群?
  • FITC_Cy5 是在别处计算的 FITC 和 Cy5 通道的交集。我关心 FITC_Cy5 在总 Cy5 中的比例或 FITC_Cy5 在总 FITC 中的比例。使用给定数据框中的数字,可以制作 3 个集合(TRITC、FITC 和 Cy5)的维恩图
【解决方案2】:

这就是我最终做到的方式。它是拆分数据和在每个folder 级别内进行一些过滤的组合,以及稍后能够重新加入的一些名称更改。 一旦每个z_stack_id 对每个通道(FITC_blobs、TRITC_blobs、Cy5_blobs)都有适当的值,我们就可以bind_rows 并做比​​例。这种方法仍然会给出虚假的比例,但可以很容易地过滤掉它们。

我不得不重命名一些列,因为我的真实数据的列与简化问题中发布的列不同。我把它压缩成一个函数。

calculate_blob_proportions <- function(dataframe){




  dataframe <- dataframe %>% ungroup()

# prepare a list

      li <- list()


  for (i in unique(dataframe$folder)){
    # Get each folder
    my_df <- dataframe %>% filter(folder == i) %>%
      mutate(filename_cells = ifelse(is.na(filename_cells),
                                     filename_coloc,
                                     filename_cells)) %>%
      rename(filename = filename_cells) %>%
      select(-filename_coloc)

    Cy5 <- filter(my_df, binary_layer=="Cy5") %>%
      rename(Cy5_blobs = n_blobs) %>%
      select(-binary_layer, -filename) %>% 
      left_join(my_df)

    TRITC <- filter(my_df, binary_layer=="TRITC") %>%
      rename(TRITC_blobs = n_blobs) %>%
      select(-binary_layer, -filename) %>% 
      left_join(my_df)

    FITC <- filter(my_df, binary_layer=="FITC") %>%
      rename(FITC_blobs = n_blobs) %>%
      select(-binary_layer, -filename) %>% 
      left_join(my_df)


    li[[i]] <- left_join(Cy5,left_join(TRITC,FITC)) %>%
      select(RatID, folder, filename, z_stack_id,
             binary_layer, n_blobs,
             FITC_blobs, TRITC_blobs, Cy5_blobs)

  }


  df_out <- bind_rows(li) %>% 
            mutate(FITC_prop = n_blobs/FITC_blobs,
                   TRITC_prop = n_blobs/TRITC_blobs,
                   Cy5_prop = n_blobs/Cy5_blobs)

  return(df_out)

}

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 2021-03-31
    • 2022-09-29
    相关资源
    最近更新 更多