R选择以第二列为条件的最高计数单元格

R Selecting highest count cells conditional on a second column

抱歉,如果这是重复的,请告诉我,我很乐意删除。

我正在尝试 select 另一列的不同值的四个最高值。

数据集:

   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

例如,我想 select 四个最高值,当 A=1 (9,7,7,6) 然后当 A=2 (9,8,5,5) 等等...

我在 'selecting highest values' 上查看了各种答案,但很难在另一列上找到条件调节示例。

非常感谢

您可以将 COUNT 除以 A,然后获取每个子组的前 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

您可以使用聚合:

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
library(dplyr)
new1 <- df %>%
  group_by(A)%>%
  summarise(y = tail(sort(COUNT),4))

我们可以先将数据框按ACOUNT的降序排列,对数据框进行分片,保留A中每组的前4行。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)

另一个基础 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

到return一个命名列表。

by

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

屏幕上的输出看起来更漂亮。

您可以使用 do.call rbind 范式将它们都放入一个矩阵中。例如,

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

到 return 具有前 4 个值的 data.table。