从数据框中弹出观察/行

时间:2016-10-21 12:35:46

标签: r dplyr tidyverse

我的数据如下:

library(tidyverse)

set.seed(1)
df <- tibble(
    id = c("cat", "cat", "mouse", "dog", "fish", "fish", "fish"),
    value = rnorm(7, 100, sd = 50)
)

我如何“弹出”fish的最高值,如将鱼移动到新数据框并同时将其从当前数据框中删除?

这有效(但看起来并不那么优雅):

df_store <- df %>% 
    filter(id == "fish") %>% 
    top_n(1)

df <- anti_join(df, df_store)

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

您可以使用包pipeR在一行中执行这两项操作。

library(pipeR); library(dplyr)
df <- df %>>% filter(id == "fish") %>>% top_n(1) %>>% (~ df2) %>% anti_join(df, .)
print(df2)
#### 1  fish 124.3715
print(df)
#### 1 mouse  58.21857
#### 2   dog 179.76404
#### 3  fish  58.97658
#### 4   cat  68.67731
#### 5   cat 109.18217
#### 6  fish 116.47539

我不是pipeR的专家,因此您可以查看here,管道内的这种分配实际上是如何运作的。

只需一句话:在使用top_n时,我建议您指定值列,默认情况下,它是最后一列,但您很容易忘记它:top_n(1, value)