如何在R中从向量中获取前n个元素(按频率排序)?

9

如何在R中获取数组的前n个排名?

假设我有:

a <- c(67, 2, 100, 2, 100, 23, 2, 100, 67, 89,100)

如何获得:

rank   number   times
1     100       4
2     2         3
3     67        2
4     23        1
4     89        1

谢谢@mrdwab。我现在正在尝试使用table,但是无法理解如何使用它。您能否给我一个小例子作为正确的答案? - pedrosaurio
6个回答

11
tab <- table(a<-c(67, 2, 100, 2, 100, 23, 2, 100, 67, 89,100))
df <- as.data.frame(tab)
names(df) <- c("number","times")
df$rank <- rank(-df$times,ties.method="min")
df <- df[order(df$rank,decreasing = F),]
df
  number times rank
5    100     4    1
1      2     3    2
3     67     2    3
2     23     1    4
4     89     1    4

3
目前为止,只有你一个回答考虑到了排名这一点,所以我给你点赞!这正是提问者想要的! - A5C1D2H2I1M1N2O1R2T1

7

使用带有sorttable

sort(table(a), decreasing=TRUE)
a
100   2  67  23  89 
  4   3   2   1   1 

如果你想将结果转换为数据框,只需将所有内容用 data.frame() 包裹即可:
data.frame(count=sort(table(a), decreasing=TRUE))
    count
100     4
2       3
67      2
23      1
89      1

3
您可以尝试像这样做:

您可以尝试类似于以下内容:

a <- c(67, 2, 100, 2, 100, 23, 2, 100, 67, 89,100)
DF <- as.data.frame(table(a))

DF[order(DF[,2], decreasing = TRUE), ]
    a Freq
5 100    4
1   2    3
3  67    2
2  23    1
4  89    1

1

或者使用 plyr 包中的 count 函数:

require(plyr)
df = count(a)
df[order(df[["freq"]], decreasing = TRUE),] 
    x freq
5 100    4
1   2    3
3  67    2
2  23    1
4  89    1

1
一种使用 dplyr 的解决方案可能是:

library(dplyr)
df <- tibble(a = c(67, 2, 100, 2, 100, 23, 2, 100, 67, 89,100))
df %>% 
  count(a) %>% 
  mutate(rank = min_rank(-n)) %>%
  arrange(desc(n)) %>% 
  rename(number = a, times = n)
#> # A tibble: 5 x 3
#>   number times  rank
#>    <dbl> <int> <int>
#> 1    100     4     1
#> 2      2     3     2
#> 3     67     2     3
#> 4     23     1     4
#> 5     89     1     4

0

您可以使用df[df>0] <- 1,然后是rowSums(df),最后是with(df, df[order(-x, y, z), ],其中-x是频率数据的列,其他是I.D列和您拥有的补充信息。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接