Search code examples
rcountdplyrfrequency

2 factor based count table using dplyer for independent columns in r


I have a data frame as below:

structure(list(group = c("K4", "K4", "K1", "K1", "K4", "K4", 
"K1", "K4", "K5", "K4", "K4", "K5", "K4", "K3", "K3", "K4", "K4", 
"K4", "K4", "K3", "K3", "K5", "K3", "K5", "K3", "K5", "K3", "K3", 
"K1", "K4", "K5", "K4", "K2", "K4", "K2", "K5", "K1", "K1", "K1", 
"K1", "K1", "K1", "K3", "K4", "K3", "K3", "K3", "K1", "K1", "K5", 
"K5", "K1", "K1", "K1", "K1", "K1", "K1", "K5", "K1", "K3", "K4", 
"K3", "K2", "K4", "K4", "K4", "K3", "K2", "K4", "K3", "K4", "K3", 
"K2", "K5", "K4", "K3", "K4", "K5", "K5", "K4", "K4", "K4", "K4", 
"K1", "K2", "K4", "K4", "K5", "K3", "K3", "K5", "K5", "K4", "K4", 
"K4", "K4", "K3", "K1", "K3", "K5", "K3", "K3", "K3", "K4", "K1", 
"K1", "K2", "K5", "K5", "K5", "K3", "K5", "K4", "K5", "K5", "K4", 
"K2", "K5", "K2", "K4", "K4", "K4", "K4", "K4", "K4", "K3", "K4", 
"K1", "K2", "K4", "K1", "K4", "K4", "K4", "K1", "K1", "K5", "K5", 
"K1", "K5", "K5", "K5", "K4", "K3", "K3", "K5", "K4", "K4", "K3", 
"K2", "K3", "K4", "K3", "K3", "K3", "K3", "K3", "K3", "K5", "K4", 
"K5", "K5", "K4", "K5", "K1", "K5", "K1", "K1", "K5", "K5", "K5", 
"K1", "K4", "K5", "K1", "K3", "K5", "K4", "K5", "K2", "K2", "K4", 
"K1", "K2", "K3", "K4", "K4", "K2", "K4", "K4", "K2", "K4", "K5", 
"K5", "K3", "K2", "K4", "K4", "K1", "K1", "K1", "K1", "K4", "K3", 
"K3", "K4", "K5", "K5", "K4", "K5", "K4", "K3", "K4", "K5", "K3", 
"K4", "K1", "K3", "K3", "K4", "K3", "K4", "K3", "K1", "K5", "K5", 
"K1", "K1", "K5", "K5", "K1", "K1", "K1", "K1", "K5", "K4", "K4", 
"K3", "K3", "K3", "K3", "K3", "K3", "K4", "K4", "K5", "K1", "K4", 
"K5", "K5", "K4", "K4", "K5", "K4", "K5", "K5", "K4", "K4", "K5", 
"K4", "K5", "K5", "K5", "K5", "K5", "K2", "K1", "K5", "K1", "K4", 
"K4", "K1", "K1", "K1", "K1", "K1", "K1", "K1", "K1", "K1"), 
    gene1 = c("MT", "MT", "WT", "WT", "MT", "MT", "MT", "MT", 
    "WT", "MT", "MT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "WT", "MT", "MT", "MT", "WT", "MT", "MT", 
    "MT", "MT", "WT", "WT", "MT", "MT", "MT", "WT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "WT", 
    "MT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "WT", "WT", "MT", "WT", 
    "WT", "MT", "MT", "MT", "MT", "WT", "MT", "MT", "MT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "MT", "MT", 
    "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "WT", "MT", "MT", "MT", "MT", "WT", "WT", 
    "MT", "MT", "MT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "WT", "MT", "WT", "MT", "WT", "MT", "MT", "WT", "MT", "WT", 
    "MT", "WT", "WT", "WT", "MT", "MT", "WT", "MT", "WT", "WT", 
    "WT", "WT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "WT", "MT", "WT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "WT", "MT", "WT", "MT", "MT", "WT", "WT", 
    "MT", "WT", "MT", "WT", "MT", "WT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "WT", 
    "MT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "WT", "WT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT"), gene2 = c("WT", "WT", "MT", "MT", "MT", "MT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "MT", "WT", "WT", "WT", 
    "MT", "WT", "MT", "WT", "WT", "MT", "WT", "WT", "WT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "WT", "WT", "WT", "MT", "MT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "MT", "WT", "MT", "MT", 
    "WT", "WT", "WT", "WT", "WT", "MT", "MT", "WT", "WT", "WT", 
    "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "MT", "MT", "MT", "WT", "WT", "WT", 
    "WT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "WT", "MT", 
    "MT", "MT", "WT", "WT", "MT", "MT", "MT", "WT", "MT", "MT", 
    "WT", "WT", "WT", "WT", "MT", "WT", "WT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "MT", "MT", "WT", "WT", "MT", "WT", "WT", "WT", "MT", 
    "WT", "MT", "WT", "MT", "MT", "MT", "WT", "MT", "MT", "MT", 
    "MT", "MT", "WT", "MT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "WT", 
    "WT", "WT", "MT", "MT", "MT", "MT", "MT", "MT", "MT", "WT", 
    "WT", "MT", "WT", "MT", "WT", "MT", "WT", "WT", "MT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "MT", "MT", 
    "MT", "MT", "WT", "WT", "MT", "MT", "MT", "MT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "MT", 
    "MT", "MT", "MT", "MT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "MT", "MT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", 
    "MT", "MT", "MT", "WT", "WT", "MT", "MT", "MT", "MT", "MT", 
    "MT", "MT", "MT", "MT"), gene3 = c("WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "MT", "MT", "MT", "MT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "MT", "MT", "WT", "WT", "MT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "MT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "MT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "MT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "MT", "MT", "MT", "MT", "MT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "MT", 
    "MT", "MT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT"), gene4 = c("WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "MT", "MT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "MT", "MT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "MT", 
    "MT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "MT", "MT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT", 
    "WT", "WT", "WT", "WT", "WT", "WT", "WT", "WT")), row.names = c(NA, 
-280L), class = "data.frame")

I want to count the number of each factor in columns 2:5 separately for each column, also divided into factors in column1.

I can achieve this for single column by mydata %>% group_by(group) %>% select(gene1) %>% table() but not for all columns at the same time. I would also like to add a column with percentage for "WT" at the end of each row.

Thank you.


Solution

  • You could reshape the data to long format and then count the occurrence

    library(dplyr)
    
    df %>% 
      tidyr::pivot_longer(cols = -group) %>%
      #Or in older version use gather
      #gather(name, value, -group) %>%
      count(group, name, value)
    
    # A tibble: 38 x 4
    #   group name  value     n
    #   <chr> <chr> <chr> <int>
    # 1 K1    gene1 MT       49
    # 2 K1    gene1 WT        9
    # 3 K1    gene2 MT       46
    # 4 K1    gene2 WT       12
    # 5 K1    gene3 MT        2
    # 6 K1    gene3 WT       56
    # 7 K1    gene4 MT        2
    # 8 K1    gene4 WT       56
    # 9 K2    gene1 MT       15
    #10 K2    gene1 WT        3
    # … with 28 more rows
    

    To get the ratio you could do

    df %>% 
      tidyr::pivot_longer(cols = -group) %>%
      count(group, name, value) %>%
      group_by(group, name) %>%
      mutate(mean_n = n/sum(n))