1

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

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

数据集:

   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) 时选择四个最高值,依此类推...

我查看了有关“选择最高值”的各种答案,但一直在努力寻找另一列的示例条件。

非常感谢

4

5 回答 5

5

您可以拆分COUNTA然后获取每个子组的前 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
于 2017-08-01T14:56:00.060 回答
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
于 2017-08-01T15:03:40.347 回答
1
library(dplyr)
new1 <- df %>%
  group_by(A)%>%
  summarise(y = tail(sort(COUNT),4))
于 2017-08-01T15:05:44.250 回答
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.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

返回具有前 4 个值的 data.table。

于 2017-08-01T15:22:10.010 回答
1

我们可以先将数据帧按A和 降序排列,将数据帧COUNT切片以保留 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)
于 2017-08-01T15:09:35.433 回答