2017-08-01 46 views
1

道歉,如果這是重複請讓我知道,我會很樂意刪除。R在第二列上選擇最高計數單元

我正在嘗試爲另一列的不同值選擇四個最高值。

數據集:

A COUNT 
1 1  2 
2 1  6 
3 1  3 
4 1  9 
5 1  2 
6 1  7 
7 1  0 
8 1  5 
9 1  2 
10 1  7 
11 2  5 
12 2  1 
13 2  8 
14 2  9 
15 2  5 
16 2  2 
17 2  2 
18 2  4 
19 3  7 
20 3  5 
21 3  2 
22 3  8 
23 3  6 
24 3  1 
25 3  9 
26 3  5 
27 4  8 
28 4  1 
29 4  1 
30 4  3 
31 4  9 

例如,我想選擇四種最高值時,A = 1(9,7,7,6),則當A = 2(9,8,5,5 )等等......

我看過「選擇最高值」的各種答案,但一直在努力在另一列找到一個示例條件。

非常感謝

回答

5

您可以通過A分裂COUNT然後拿到前4名值對每個子組

lapply(split(df$COUNT, df$A), function(x) head(sort(x, decreasing = TRUE), 4)) 
#$`1` 
#[1] 9 7 7 6 

#$`2` 
#[1] 9 8 5 5 

#$`3` 
#[1] 9 8 7 6 

#$`4` 
#[1] 9 8 3 1 

使用sapply會給人一種更友好的輸出

sapply(split(df$COUNT, df$A), function(x) head(sort(x, decreasing = TRUE), 4)) 
#  1 2 3 4 
#[1,] 9 9 9 9 
#[2,] 7 8 8 8 
#[3,] 7 5 7 3 
#[4,] 6 5 6 1 
3

您可以使用聚合:

aggr <- aggregate(COUNT~A,data=DF,function(x)head(sort(x,decreasing=TRUE),4)) 
> aggr 
    A COUNT.1 COUNT.2 COUNT.3 COUNT.4 
1 1  9  7  7  6 
2 2  9  8  5  5 
3 3  9  8  7  6 
4 4  9  8  3  1 
1
library(dplyr) 
new1 <- df %>% 
    group_by(A)%>% 
    summarise(y = tail(sort(COUNT),4)) 
+0

您的代碼導致出現此錯誤消息:在summarise_impl(。數據,點): 列'y'必須是長度1(彙總值),而不是4 – www

1

我們可以先通過A安排數據幀和COUNT降,和切片數據幀,以保持頂部4行各組中A. dt2是這種輸出。

library(dplyr) 
library(tidyr) 

dt2 <- dt %>% 
    arrange(A, desc(COUNT)) %>% 
    group_by(A) %>% 
    slice(1:4) 

之後,我們也可以將數據幀從長格式改爲寬格式。 dt3是這個的輸出。

dt3 <- dt2 %>% 
    mutate(Count_Num = paste0("Count", 1:n())) %>% 
    spread(Count_Num, COUNT) 
1

另一個基礎R選項tapplyorder[

tapply(dat$COUNT, dat$A, function(x) x[order(-x)][1:4]) 
$`1` 
[1] 9 7 7 6 

$`2` 
[1] 9 8 5 5 

$`3` 
[1] 9 8 7 6 

$`4` 
[1] 9 8 3 1 

返回命名列表。

by

by(dt$COUNT, dt$A, function(x) x[order(-x)][1:4]) 

你在屏幕上更好看輸出。

您可以將這兩種情況轉換爲與do.callrbind範例中的矩陣。例如,

do.call(rbind, by(dt$COUNT, dt$A, function(x) x[order(-x)][1:4])) 
    [,1] [,2] [,3] [,4] 
1 9 7 7 6 
2 9 8 5 5 
3 9 8 7 6 
4 9 8 3 1 

隨着data.table,你可以做

library(data.table) 
setDT(dat)[order(-COUNT), head(COUNT, 4), by="A"] 
    A V1 
1: 1 9 
2: 1 7 
3: 1 7 
4: 1 6 
5: 2 9 
6: 2 8 
7: 2 5 
8: 2 5 
9: 3 9 
10: 3 8 
11: 3 7 
12: 3 6 
13: 4 9 
14: 4 8 
15: 4 3 
16: 4 1 

返回一個data.table與前4個值。

相關問題