2016-10-21 91 views
2

我的數據是這樣的:流行了觀察/行

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

僅供參考,在基礎R,你可以做到這一點使用'split'使用'split(df,with(df,id ==「fish」&value == max(value [id ==「fish」]))創建'data.frame'列表' –

回答

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)