Select p 列所有值中具有最小值的 3 行

Select 3 rows which have the smallest value among all values in the column p

我有一个数据框 df。我想要 select 列 p.

中具有最小值的 3 行

df

     p      b
as   0.6    ab
yu   0.3    bc
hy   0.05   ak
get  0.7    ka

结果

     p      b
as   0.6    ab
yu   0.3    bc
hy   0.05   ak

两种方法:

df[df$p <= sort(df$p)[3],]
#       p  b
# as 0.60 ab
# yu 0.30 bc
# hy 0.05 ak

一个问题是,当 p 中出现并列(第三个)时,您将获得超过 3 行。此外,当少于 3 行时,这将无法正常工作。

另一种方法,如果您不关心顺序:

head(df[order(df$p),], n = 3)

它的优点是它总是给出最小的 3 或实际的行数。这样做的一个问题是它不会告诉您有平局,它只会限制行数。

(可以通过添加具有预先安排的顺序的列来减轻重新排序,然后在该列上重新排列 post head。)

交给你哪个流程更有意义。


编辑:保留顺序的选项:

df[ rank(df$p) < 4,]

(灵感来自@NotThatKindODr 建议使用有序 row_number() %in% 1:3

您可以对 p 上的数据进行排序,然后过滤 1:x

中的行号
library(tidyverse)
df %>% 
  arrange(p) %>% 
  filter(row_number() %in% 1:3)

另一个 option 使用 dplyr::slice_min

library(dplyr)

df %>% slice_min(p, n = 3)