Как найти 30 наиболее часто встречающихся значений в большом наборе данных? - PullRequest
0 голосов
/ 04 марта 2020

Есть ли в R функция для поиска 30 наиболее часто встречающихся элементов в большом наборе данных? У меня есть данные 38 916 х 48 (столбцы х строк). Я попробовал коды ниже и получил тот же ответ

Ошибка в таблице (новая): попытка создать таблицу с> = 2 ^ 31 элементами

which.max(table(new))

или

data <- na.omit(sort(table(new$"0:48"),decreasing=TRUE, na.last = TRUE)[1:30000])

enter image description here

Ответы [ 3 ]

1 голос
/ 04 марта 2020

Если вы этого не сделаете, было бы неплохо сохранить ваши данные в matrix. По крайней мере, на моем P C использование table и sort дает мне 30 самых частых значений .

set.seed(42)
d <- c(38916, 48)
x <- matrix(sample(1:999, prod(d), TRUE), d[2], d[1])

sort(table(x), TRUE)[1:30]
#x
#  39  121  444  134   75  455  540  786  188  882  195  824  559  982  864  230 
#2010 1999 1994 1982 1977 1975 1974 1973 1972 1969 1966 1965 1964 1964 1962 1961 
# 872  944  269  273  527  687  184  334  521  582   66  423  552  998 
#1961 1958 1957 1957 1957 1957 1956 1956 1956 1955 1954 1954 1954 1954 

В случае, если у вас есть data.frame, он будет производить количество случаев на полях, что будет большим:

table(as.data.frame(x))
#Fehler in table(as.data.frame(x)) : 
#  Versuch eine Tabelle mit mehr als 2^31 Elementen zu erstellen

Ее можно использовать unlist:

sort(table(unlist(as.data.frame(x))), TRUE)[1:30]
#  39  121  444  134   75  455  540  786  188  882  195  824  559  982  864  230 
#2010 1999 1994 1982 1977 1975 1974 1973 1972 1969 1966 1965 1964 1964 1962 1961 
# 872  944  269  273  527  687  184  334  521  582   66  423  552  998 
#1961 1958 1957 1957 1957 1957 1956 1956 1956 1955 1954 1954 1954 1954 
1 голос
/ 04 марта 2020

Поскольку ваши столбцы, кажется, не имеют смысла, вы можете попробовать это:

library(dplyr)
new.2 <- data.frame(names = c(new))
new.2 %>% group_by(names) %>% summarise(cnt = n()) %>% arrange(desc(cnt)) %>% head(30)
0 голосов
/ 04 марта 2020

Существует несколько способов достижения того, что вы ищете. Вот пример фиктивного набора данных:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...