如何在大数据集中找到30个最频繁的值?

时间:2020-03-04 13:21:32

标签: r

R中是否有任何功能可以在大数据集中找到30个最常出现的元素?我有38 916 x 48(列x行)的数据。我在下面尝试了代码并收到了相同的答案

表中的错误(新):尝试使用> = 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 个答案:

答案 0 :(得分:1)

由于您的专栏似乎没有意义,您可以尝试以下方法:

library(dplyr)
new.2 <- data.frame(names = c(new))
new.2 %>% group_by(names) %>% summarise(cnt = n()) %>% arrange(desc(cnt)) %>% head(30)

答案 1 :(得分:1)

如果没有,最好将数据存储在matrix中。至少在我的PC上使用tablesort为我提供了 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 

答案 2 :(得分:0)

有多种方法可以实现您想要的。下面是一个虚拟数据集的示例:

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

使用dplyrcount提取热门词语的替代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