Существует несколько способов достижения того, что вы ищете. Вот пример фиктивного набора данных:
df <- data.frame(C1 = sample(LETTERS[1:26],10, replace = TRUE),
C2 = sample(LETTERS[1:26],10, replace = TRUE),
C3 = sample(LETTERS[1:26],10, replace = TRUE))
C1 C2 C3
1 S K W
2 S L S
3 K F M
4 Q A S
5 O K D
6 N T R
7 I F L
8 A L H
9 Z W V
10 M O B
Вы можете начать с извлечения всех элементов в один вектор, выполнив:
vec <- as.character(unlist(df))
Затем вы можете использовать data.table
это быстрее для большого набора данных для подсчета, сортировки и извлечения самых частых значений:
library(data.table)
dt <- as.data.table(vec)
dt[, `:=`(count = .N), by = vec]
dt <- dt[order(-count),]
dt[1:10,]
vec count
1: S 4
2: S 4
3: S 4
4: S 4
5: K 3
6: K 3
7: L 3
8: K 3
9: L 3
10: L 3
Альтернативное решение dplyr
, использующее count
и slice
для извлечения верхних терминов:
library(dplyr)
as.data.frame(vec) %>%
count(vec) %>%
arrange(-n) %>%
slice(1:10)
# A tibble: 10 x 2
vec n
<fct> <int>
1 S 4
2 K 3
3 L 3
4 A 2
5 F 2
6 M 2
7 O 2
8 W 2
9 B 1
10 D 1