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])
答案 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上使用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
答案 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
使用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