计算多列的每个字母的频率

Tan*_*ay 1 r

我有一个数据框如下:

> dfnew

   C1 C2 C3 C4   C5   C6
1   A  A  G  A    G    A
2   A  T  T  T    G    G
3   T  A  G  A    T    A
4   C  A  A  A    A    G
5   C  A  T  T    T    C
6   C  A  A  A    T    A
7   T  C  T  G    A    A
8   G  A  G  C    T    A
9   C  T  A  T    G    A
10  G  A  A  A    G    G
11  G  G  T  T    T    A
12  G  A  C  T    T    A
13  T  T  C  T    T    T
14  A  T  A  G    C    T
15  A  C  A  A    A    A
16  A  A  C  A    A    A
17  T  G  G  A    A    T
18  A  A  A  A    G    T
19  G  T  G  G <NA> <NA>
Run Code Online (Sandbox Code Playgroud)

我希望在没有循环的情况下在R中的一行代码中得到如下答案:

A   6   10  7   9   5   10
C   4   2   3   1   1   1
G   5   2   5   3   5   3
T   4   5   4   6   7   4
Run Code Online (Sandbox Code Playgroud)

akr*_*run 6

我们可以用sapply遍历所有的列,将其转换为factorlevels指定的,并得到与频率table

sapply(dfnew, function(x) table(factor(x, levels = c("A", "C", "G", "T"))))
Run Code Online (Sandbox Code Playgroud)

或使用 tidyverse

library(dplyr)
library(tidyr)
dfnew %>% 
    gather(key, val, na.rm = TRUE) %>% 
    count(key, val) %>% 
    spread(key, n)
Run Code Online (Sandbox Code Playgroud)