道歉,如果这是重复请告诉我,我很乐意删除。
我正在尝试为另一列的不同值选择四个最高值。
数据集:
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)时选择等等...
我已经在“选择最高价值”上找到了各种答案,但却在努力寻找另一个专栏的示例条件。
非常感谢
答案 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)
我们可以先按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)
答案 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。