2012-08-14 56 views
7

如何獲得R中數組的前n個排名?如何從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 
+1

你試過'table'? – A5C1D2H2I1M1N2O1R2T1 2012-08-14 10:14:39

+0

謝謝@mrdwab。我現在試着在你的建議之後使用'table',但無法理解如何使用它。你能幫助我一個小例子作爲正確的答案嗎? – pedrosaurio 2012-08-14 10:21:11

回答

9
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 
+1

+1是迄今爲止僅作爲答案的答案,因此增加了排名的麻煩,這是OP想要的! – A5C1D2H2I1M1N2O1R2T1 2012-08-14 10:36:20

2

你可以嘗試這樣的事情:

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 
5

使用tablesort

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 
0

或者使用count從plyr包:

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 
0

您可以使用df[df>0] <- 1,稍後rowSums(df),最後是with(df, df[order(-x, y, z), ]其中-x是頻率數據的列,其他列是I.D列,以及您擁有的充足信息。

0

一個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 
相關問題