2017-08-01 56 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个值。