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))
我们可以先将数据框按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)
另一个基础 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
到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。
抱歉,如果这是重复的,请告诉我,我很乐意删除。
我正在尝试 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))
我们可以先将数据框按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)
另一个基础 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
到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。