有没有办法将所有 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里其中一列数据(符合指定条件的)依次显示在另一列里