R根据第二列

时间:2017-08-01 14:54:16

标签: r select dataframe highest

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

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

数据集:

   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 个答案:

答案 0 :(得分:5)

您可以将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

答案 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

答案 2 :(得分:1)

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

答案 3 :(得分:1)

我们可以先按ACOUNT的降序排列数据框,然后将数据框切片以保持每组中的前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)

答案 4 :(得分:1)

另一个基本R选项是tapply order[

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。

相关问题