Вывести наблюдение / строку из фрейма данных

Мои данные выглядят так:

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)

Есть ли способ лучше?


person emehex    schedule 21.10.2016    source источник
comment
fyi, в базе R вы могли бы сделать это, используя split, чтобы создать list из data.frame, используя split(df, with(df, id == "fish" & value == max(value[id == "fish"])))   -  person talat    schedule 21.10.2016


Ответы (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, поэтому вы можете проверить это здесь, как на самом деле работает такое назначение внутри канала.

Одно замечание: при использовании top_n я рекомендую указать столбец значений, по умолчанию это последний столбец, но вы можете легко его забыть: top_n(1, value)

person agenis    schedule 21.10.2016