2 基于因素的计数 table 对 r 中的独立列使用 dplyer

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

我有如下数据框:

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")

我想对每一列分别统计2:5列中每个因子的个数,也分为column1中的因子。

我可以通过 mydata %>% group_by(group) %>% select(gene1) %>% table() 对单个列实现此目的,但不能同时对所有列实现。 我还想在每一行的末尾添加一个百分比为 "WT" 的列。

谢谢。

以下代码给出了与示例不同的输出结构,但包含每列每组的数据:

library(reshape2)

mydata1 = melt(mydata,id.vars = c('group'))

mydata2 = mydata1 %>% 
  dplyr::group_by_all() %>% 
  dplyr::summarise(Count = n()) %>% 
  dplyr::group_by(group,variable) %>% 
  dplyr::mutate(Sum = sum(Count,na.rm=T)) %>% 
  dplyr::ungroup() %>% 
  dplyr::mutate(percentage = Count/Sum*100)

输出结果如下:

group variable value Count Sum percentage
1   K1  gene1   MT  49  58  84.482759
2   K1  gene1   WT  9   58  15.517241
3   K2  gene1   MT  15  18  83.333333
4   K2  gene1   WT  3   18  16.666667
5   K3  gene1   MT  45  54  83.333333
6   K3  gene1   WT  9   54  16.666667
7   K4  gene1   MT  77  85  90.588235
8   K4  gene1   WT  8   85  9.411765
9   K5  gene1   MT  35  65  53.846154
10  K5  gene1   WT  30  65  46.153846
11  K1  gene2   MT  46  58  79.310345
12  K1  gene2   WT  12  58  20.689655
13  K2  gene2   MT  4   18  22.222222
14  K2  gene2   WT  14  18  77.777778
15  K3  gene2   MT  23  54  42.592593
16  K3  gene2   WT  31  54  57.407407
17  K4  gene2   MT  23  85  27.058824
18  K4  gene2   WT  62  85  72.941176
19  K5  gene2   MT  30  65  46.153846
20  K5  gene2   WT  35  65  53.846154
21  K1  gene3   MT  2   58  3.448276
22  K1  gene3   WT  56  58  96.551724
23  K2  gene3   WT  18  18  100.000000
24  K3  gene3   MT  5   54  9.259259
25  K3  gene3   WT  49  54  90.740741
26  K4  gene3   MT  7   85  8.235294
27  K4  gene3   WT  78  85  91.764706
28  K5  gene3   MT  5   65  7.692308
29  K5  gene3   WT  60  65  92.307692
30  K1  gene4   MT  2   58  3.448276
31  K1  gene4   WT  56  58  96.551724
32  K2  gene4   WT  18  18  100.000000
33  K3  gene4   MT  2   54  3.703704
34  K3  gene4   WT  52  54  96.296296
35  K4  gene4   MT  4   85  4.705882
36  K4  gene4   WT  81  85  95.294118
37  K5  gene4   MT  2   65  3.076923
38  K5  gene4   WT  63  65  96.923077

您可以将数据重塑为长格式,然后 count 出现

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

要得到你能做到的比例

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