r语言 - 选择变量中最常用的 n 个值



我想在数据框的列中找到最常见的值。我认为使用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

(我们使用大括号,因为我们不将左侧结果作为过滤器的第一个参数(

最新更新