2016-05-05 5 views
0

Ich habe eine Datenmenge, die wie folgt aussieht:Wählen Reihen auf dem am nächsten Tag auf Basis bei gleichzeitiger Erfüllung zusätzliche Kriterien in R

data <- read.table(text = "OID  Local_date  Dateincide  Join_Count  TARGET_FID  JOIN_FID  indiv_code  indiv_name  sex  month  year  treatment  perturbati  xx  yy  id_treatme  id_treat_1  lion_month  treatment_  OID_hc  DateRecord  Year_1  location  village  Longhomest  Lathomeste  Longitude  Latitude  Animalslos  Specieslos 
3 2015-10-25 2008-01-15 1 127415 2 NGAaF1 Ngamo_Urchin F 10 2015 E A 547514.43970000000 7883074.46200000000 11 11E NGAaF1_10_2015 11E_NGAaF1_10_2015 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-01-18 2008-01-15 1 128429 2 NGAaF1 Ngamo_Urchin F 1 2016 E A 547461.30170000000 7882858.82600000000 11 11E NGAaF1_1_2016 11E_NGAaF1_1_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-02-23 2008-01-15 1 128858 2 NGAaF1 Ngamo_Urchin F 2 2016 E A 547395.24460000000 7883056.29100000000 11 11E NGAaF1_2_2016 11E_NGAaF1_2_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2015-10-25 2008-01-15 1 130659 2 NGAaF1 Ngamo_Urchin F 10 2015 E A 547514.43970000000 7883074.46200000000 12 12E NGAaF1_10_2015 12E_NGAaF1_10_2015 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-01-18 2008-01-15 1 131673 2 NGAaF1 Ngamo_Urchin F 1 2016 E A 547461.30170000000 7882858.82600000000 12 12E NGAaF1_1_2016 12E_NGAaF1_1_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle 
3 2016-02-23 2008-01-2 2 NGAaF1 Ngamo_Urchin F 2 2016 E A 547395.24460000000 7883056.29100000000 12 12E NGAaF1_2_2016 12E_NGAaF1_2_2016 3 19-02-08 2008 E Nganyana 548505 7881998 547800 7883200 4 cattle", header = TRUE) 

Jede Zeile ist ein Datensatz mit einem Code "OID", ein "Local_date", "Dateincide" und anderen Attributen. Ich habe Daten, die gerade nicht als NA codiert sind, aber leer gelassen. Der ursprüngliche Datensatz ist groß und er hat 120.000 Zeilen und 40 Spalten, weshalb ich versuche, einen R-Code zu finden, der auf folgende Weise am effizientesten funktioniert:

Ich möchte die Werte OID durchgehen für alle Zeilen, die sich die gleichen OID teilen, um nach der Zeile zu suchen, für die "Dateincide"() am nächsten ist (entweder vorher oder nachher). Dann schreiben Sie "Behalten" für diese Zeilen mit dem nächsten Datum in einer neuen Spalte mit dem Namen "Keep/delete".

Es gibt jedoch eine Bedingung: Es gibt Zeilen, die die gleiche OID haben und das gleiche "Local_date" haben, so dass es in einigen Fällen zwei oder mehr Datensätze mit der gleichen Übereinstimmung gibt. Ich möchte alle diese Übereinstimmungen nicht nur eins behalten, weil sie unterschiedliche Aufzeichnungen entsprechend der Spalte "id_treat_1" darstellen.

Die Ausgabe, die ich will, ist die folgende (ich habe es kurz gemacht, um deutlich zu machen, aber ich möchte auch den Rest der Spalten halten):

OID Local_date Dateincide keep/delete id_treat_1 
3 2015-10-25 2008-01-15 keep  11E 
3 2016-01-18 2008-01-15 delete  11E 
3 2016-02-23 2008-01-15 delete  11E 
3 2015-10-25 2008-01-15 keep  12E 
3 2016-01-18 2008-01-15 delete  12E 
3 2016-02-23 2008-01-15 delete  12E 
13 2011-11-08 2008-02-14 keep  7E 

So gibt es 2 Datensätze mit die gleiche OID = 3, die mit "keep" gekennzeichnet wurde, weil sie das nächstliegende Datum in "Local_date" bis "Dateincide" haben und in der Spalte "id_treat_1" einen anderen Wert haben. Im Fall des Datensatzes mit OID 13 wurde die Zeile mit dem nächstliegenden Datum ausgewählt und es gibt nur eine, weil es in der Spalte "id_treat_1" keine andere Übereinstimmung gab, die einen anderen Wert hatte.

Jede Hilfe zur Berechnung dieser "Keep/delete" -Spalte, die mehrere Übereinstimmungen ermöglichen würde, und wie mit den fehlenden Daten umzugehen ist, wird sehr geschätzt!

+1

könnten Sie ein Beispiel hinterlassen, die in Betracht alle Ihre Constraints nehmen? d.h. mit verschiedenen IDs und verschiedenen ID_Treats? – Sotos

Antwort

0

Sie müssen Ihre Daten in POSIXct konvertieren, damit Sie sie subtrahieren können. Sie können dann dplyr verwenden, um die Spalte keep/delete zu erstellen.

library(dplyr) 
data$Local_date <- as.POSIXct(data$Local_date, 
           format='%Y-%m-%d') 
data$Dateincide <- as.POSIXct(data$Dateincide, 
           format='%Y-%m-%d') 
data %>% 
    group_by(OID) %>% 
    mutate(keep.delete = 
     ifelse(Local_date - Dateincide == min(Local_date - Dateincide), 'keep', 'delete')) 

#  OID Local_date Dateincide id_treat_1 keep.delete 
# (int)  (time)  (time)  (dbl)  (chr) 
#1  3 2015-10-25 2008-01-15   11  keep 
#2  3 2016-01-18 2008-01-15   11  delete 
#3  3 2016-02-23 2008-01-15   11  delete 
#4  3 2015-10-25 2008-01-15   12  keep 
#5  3 2016-01-18 2008-01-15   12  delete 
#6  3 2016-02-23 2008-01-15   12  delete 

In Bezug auf Ihre id_treat_1 Einschränkung, können Sie die oben als neuer Datenrahmen (zum Beispiel data3) speichern und sie

dann
data3$keep.delete[duplicated(data3)] <- 'delete' 
+1

Vielen Dank! Das hat perfekt funktioniert! – AnnK

Verwandte Themen