#r #dplyr #tidyverse
#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
, например, переместить fish в новый фрейм данных и одновременно удалить его из текущего фрейма данных?
Это работает (но это не кажется таким уж элегантным):
df_store <- df %>%
filter(id == "fish") %>%
top_n(1)
df <- anti_join(df, df_store)
Есть ли способ лучше?
Комментарии:
1. к вашему сведению, в базе R вы могли бы сделать это с помощью
split
для созданияlist
группыdata.frame
s с использованиемsplit(df, with(df, id == "fish" amp; value == max(value[id == "fish"])))
Ответ №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)