2017-05-19 2 views
1

Ich arbeite mit einem Datenrahmen (in R), der Beobachtungen von Tieren in freier Wildbahn (Aufnahmezeit/-datum, Standort und Artenidentifikation) enthält. Ich möchte Zeilen entfernen, die eine bestimmte Spezies enthalten, wenn weniger als x Beobachtungen im gesamten Datenfeld vorhanden sind. Ab sofort konnte ich mit dem folgenden Code arbeiten, aber ich weiß, dass es einen eleganteren und effizienteren Weg geben muss.Reihen von Datenrahmen basierend auf der Häufigkeit einer Variablen entfernen

namelist <- names(table(ind.data$Species)) 
for (i in 1:length(namelist)) { 
    if (table(ind.data$Species)[namelist[i]] <= 2) { 
    while (namelist[i] %in% ind.data$Species) { 
     j <- match(namelist[i], ind.data$Species) 
     ind.data <- ind.data[-j,] 
    } 
    } 
} 

Der namelist Vektor enthält alle Arten Namen in dem Datenrahmen ind.data und die if Anweisung überprüft, ob die Frequenz der i ten Namen auf der Liste weniger als x (2 in diesem Beispiel).

Ich bin mir völlig bewusst, dass dies nicht eine sehr saubere Art ist, es zu tun, ich habe es gestern am Ende des Tages zusammengeworfen, um zu sehen, ob es funktionieren würde. Jetzt suche ich nach einem besseren Weg, oder zumindest nach dem, wie ich es verfeinern könnte.

Antwort

0

Wir data.table verwenden können

library(data.table) 
setDT(ind.data)[, .SD[.N >2], Species] 
+1

Das hat perfekt funktioniert, danke! Es ist auch ziemlich schnell auf großen Datensätzen, besonders im Vergleich zu meiner Hacky For-Schleife von vor. – twieg

+0

@twieg Ja, data.table ist sehr schnell – akrun

1

Sie können dies mit dem dplyr Paket:

library(dplyr) 

new.ind.data <- ind.data %>% 
    group_by(Species) %>% 
    filter(n() > 2) %>% 
    ungroup() 

Eine alternative integrierte Funktionen verwendet, ist ave() zu verwenden:

group_sizes <- ave(ind.data$Species, ind.data$Species, FUN = length) 
new.ind.data <- ind.data[group_sizes > 2, ] 
+0

I versuchte den zweiten Ansatz (mit 'ave()'), aber es entfernte einige Gruppen, die mo hatten re = 2. Es wurden Gruppen mit 12, 1, 2, 17, 2, 2 bzw. 110 Beobachtungen entfernt. Irgendwelche Ideen warum? Ich begann mit 20 Arten Gruppen, aber ich endete mit 13, als ich mit 16 enden sollte. – twieg

Verwandte Themen