我想在数据框的列中找到最常见的值。我认为使用table
是最好的方法?然后,我想过滤/子集数据框以仅包含这些前 n 个值。
我的数据框示例如下。在这里,我想找到例如前 2 个 ID。
ID col
A blue
A purple
A green
B green
B red
C red
C blue
C yellow
C orange
因此,我想输出以下内容:
Top 2 values of ID are:
A and C
然后,我将选择与 ID A 和 C 对应的行:
ID col
A blue
A purple
A green
C red
C blue
C yellow
C orange
你可以试试tidyverse
。添加ID
的计数,然后筛选出前两个(使用< 3
(或前十个(使用< 11
(:
library(tidyverse)
d %>%
add_count(ID) %>%
filter(dense_rank(-n) < 3)
# A tibble: 7 x 3
ID col n
<fct> <fct> <int>
1 A blue 3
2 A purple 3
3 A green 3
4 C red 4
5 C blue 4
6 C yellow 4
7 C orange 4
数据
d <- read.table(text="ID col
A blue
A purple
A green
B green
B red
C red
C blue
C yellow
C orange", header=T)
我们可以使用table
计算值的数量,按decreasing
顺序sort
它们并选择前 2(或 10(个值,获取相应的ID
并从数据框中对这些ID
进行子集。
df[df$ID %in% names(sort(table(df$ID), decreasing = TRUE)[1:2]), ]
# ID col
#1 A blue
#2 A purple
#3 A green
#6 C red
#7 C blue
#8 C yellow
#9 C orange
随着整洁及其top_n
:
library(tidyverse)
d %>%
group_by(ID) %>%
summarise(n()) %>%
top_n(2)
Selecting by n()
# A tibble: 2 x 2
ID `n()`
<fct> <int>
1 A 3
2 C 4
要完成子集:
d %>%
group_by(ID) %>%
summarise(n()) %>%
top_n(2) %>%
{ filter(d, ID %in% .$ID) }
Selecting by n()
ID col
1 A blue
2 A purple
3 A green
4 C red
5 C blue
6 C yellow
7 C orange
(我们使用大括号,因为我们不将左侧结果作为过滤器的第一个参数(