有没有办法将所有 obs 条件保持在另一列的 top_n 值上

Posted

技术标签:

【中文标题】有没有办法将所有 obs 条件保持在另一列的 top_n 值上【英文标题】:is there a way of keeping all obs condtion on top_n value from another column 【发布时间】:2021-04-22 13:02:09 【问题描述】:

我需要找到一种使用 tidyverse 来保留所有 obs 的方法。但从列中过滤除 top_n 值之外的所有其他观察值。

示例:

Name| title      | rank
John| xxxxxx     | 1
John| yyyyyyy    | 1
John| zzzzzz     | 1
max | xxxxxx     | 3
max | yyyyyyy    | 3
max | zzzzzz     | 3
evan| xxxxxx     | 2 
evan| yyyyyyy    | 2
evan| zzzzzz     | 2

然后我想保持 top_n 排名 = 2,并且仍然保持对该排名的所有观察,这样不仅可以取消行

应该是这样的

Name| title      | value
John| xxxxxx     | 100
John| yyyyyyy    | 100
John| zzzzzz     | 100
evan| xxxxxx     | 200 
evan| yyyyyyy    | 200
evan| zzzzzz     | 200

这在 dplyr / tidyverse 中是否可行?

【问题讨论】:

我不太明白你的问题。这个“价值”从何而来? + 在上面的评论中,我想补充一下你为什么不过滤rank <3 我认为 AnilGoyal 的评论是解决这个问题的方法。 【参考方案1】:

如果您事先不知道排名(例如,您的数据如下所示),您可以在组上使用nest,使用slice_min,然后使用unnest。但是在大数据上嵌套和取消嵌套可能会变慢。

library(tidyverse)

df <- tribble(
  ~Name, ~title, ~value,
  "John", "xxxxxx", 100,
  "John", "yyyyyyy", 100,
  "John", "zzzzzz", 100,
  "max", "xxxxxx", 300,
  "max", "yyyyyyy", 300,
  "max", "zzzzzz", 300,
  "evan", "xxxxxx", 200,
  "evan", "yyyyyyy", 200,
  "evan", "zzzzzz", 200
)

df %>% 
  nest(data = c(title)) %>% 
  slice_min(order_by = value, with_ties = TRUE, n = 2) %>% 
  unnest(cols = c(data))
#> # A tibble: 6 x 3
#>   Name  value title  
#>   <chr> <dbl> <chr>  
#> 1 John    100 xxxxxx 
#> 2 John    100 yyyyyyy
#> 3 John    100 zzzzzz 
#> 4 evan    200 xxxxxx 
#> 5 evan    200 yyyyyyy
#> 6 evan    200 zzzzzz

如果你的数据真的这么简单,那么 AnilGoyal 的解决方案是最好的:

library(tidyverse)

df <- tribble(
  ~Name, ~title, ~rank,
  "John", "xxxxxx", 1,
  "John", "yyyyyyy", 1,
  "John", "zzzzzz", 1,
  "max", "xxxxxx", 3,
  "max", "yyyyyyy", 3,
  "max", "zzzzzz", 3,
  "evan", "xxxxxx", 2,
  "evan", "yyyyyyy", 2,
  "evan", "zzzzzz", 2
)

df %>% filter(rank < 3)
#> # A tibble: 6 x 3
#>   Name  title    rank
#>   <chr> <chr>   <dbl>
#> 1 John  xxxxxx      1
#> 2 John  yyyyyyy     1
#> 3 John  zzzzzz      1
#> 4 evan  xxxxxx      2
#> 5 evan  yyyyyyy     2
#> 6 evan  zzzzzz      2

由reprex package (v1.0.0) 于 2021 年 4 月 22 日创建

【讨论】:

以上是关于有没有办法将所有 obs 条件保持在另一列的 top_n 值上的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server:对列的每个组值求和(或差),直到在另一列上满足条件

如何根据另一列的条件查询同一列两次?

如何按顺序提取EXCEL里其中一列数据(符合指定条件的)依次显示在另一列里

保留数据框中的行,对于某些列的值的所有组合,在另一列中包含相同的元素

SQLite 在另一列的值上拆分列

Mysql:优化使用一列或另一列的查询