2016-10-21 1 views
2

Meine Daten sieht wie folgt aus:Pop out Beobachtung/Zeile aus einem Datenrahmen

library(tidyverse) 

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

Wie könnte ich „pop-out“, um den Spitzenwert von fish, wie in Schritt Fisch zu einem neuen Datenrahmen und gleichzeitig entfernen es aus dem aktuellen Datenrahmen?

Das funktioniert (aber es scheint nicht, dass alle elegant):

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

df <- anti_join(df, df_store) 

Gibt es einen besseren Weg?

+1

FYI, in der Basis R, können Sie diese mit 'split' zu tun um eine 'liste' von' data.frame's mit 'split (df, mit (df, id ==" fisch "& value == max (wert [id ==" fisch "])))' 'zu erstellen –

Antwort

1

Sie können beide Aktionen in einer einzigen Zeile ausführen, indem Sie das Paket pipeR verwenden.

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 

Ich bin kein Experte von pipeR so können Sie es here überprüfen, wie diese Art der Zuordnung innerhalb eines Rohres tatsächlich funktioniert.

Nur eine Bemerkung: wenn top_n mit i empfehlen den Wert Spalte angeben, standardmäßig ist es die letzte Spalte, aber man kann leicht vergessen: top_n(1, value)

Verwandte Themen