2017-01-12 5 views
0

ich einen Datenrahmen des folgenden Typs haben:Werte Vergleich unter Spalten-Kombinationen

date  ID1 ID2 sum 
2017-1-5 1  a  200 
2017-1-5 1  b  150 
2017-1-5 2  a  300 
2017-1-4 1  a  200 
2017-1-4 1  b  120 
2017-1-4 2  a  300 
2017-1-3 1  b  150 

Ich versuche, zwischen den Spalten Kombinationen über verschiedenen Zeitpunkten zu vergleichen, um zu sehen, ob die sum Werte gleich sind. Also, in dem oben genannten Beispiel möchte ich den Code zu identifizieren, dass die Summe der [ID1=1, ID2=b] Kombination ist zwischen 2017-1-5 und 2017-1-4 (In meinen realen Daten habe ich mehr als 2 ID Kategorien und mehr als 2 Dates).

Ich möchte, dass meine Ausgabe ein Datenrahmen ist, der alle Kombinationen enthält, die (mindestens ein) ungleiche Ergebnisse enthalten. In meinem Beispiel:

date  ID1 ID2 sum 
2017-1-5 1  b  150 
2017-1-4 1  b  120 
2017-1-3 1  b  150 

Ich versuchte es mit Schleifen wie diese zu lösen: Is there a R function that applies a function to each pair of columns ohne großen Erfolg.

Ihre Hilfe wird geschätzt.

+0

Wie soll Ihre Ausgabe aussehen? Wenn Sie mehr als zwei Daten für eine Kombination von IDs haben, möchten Sie nur angeben, dass sie alle gleich sind oder nicht? Oder wollen Sie die einzigartigen identifizieren, oder was? – aichao

+0

Ich möchte ** die Kombination kennzeichnen, wo die Summe nicht gleich war; zB ein Datenrahmen, der wie folgt aussieht: (Zeilen; 'Datum') und (Spalten;' ID1', 'ID2',' Summe') ... so in meinem Beispiel: (1. Zeile = '2017-1 -5') (2. Zeile = '2017-1-4') und (1. Spalte =' ID1') (2. Spalte = 'ID2') (3. Spalte =' Summe') ... und die 2 Zellen werden angezeigt 150 und 120. Hoffe, es war klar .. Ich könnte meine Frage ändern .. – staove7

+0

Was ist, wenn Sie drei Daten haben und zwei von ihnen die gleiche Summe haben, aber die dritte nicht? Welche der beiden möchten Sie dann in Ihrer Ausgabe kennzeichnen? – aichao

Antwort

0

Mit dplyr können wir group_by_(.dots=paste0("ID",1:2)) und dann sehen, ob die Werte unique sind:

library(dplyr) 
res <- df %>% group_by_(.dots=paste0("ID",1:2)) %>% 
       mutate(flag=(length(unique(sum))==1)) %>% 
       ungroup() %>% filter(flag==FALSE) %>% select(-flag) 

Die group_by_ können Sie gruppieren mehrere ID Spalten leicht. Ändern Sie einfach 2 in so viele ID Spalten (d. H. N) Sie haben angenommen, dass sie fortlaufend von 1 bis N nummeriert sind. Die Spalte flag wird erstellt, um anzuzeigen, ob alle Werte gleich sind (d. H. Die Anzahl der Werte unique ist 1). Dann wir filter für Ergebnisse, für die flag==FALSE. Dies ergibt das gewünschte Ergebnis:

res 
### A tibble: 3 x 4 
##  date ID1 ID2 sum 
##  <chr> <int> <chr> <int> 
##1 2017-1-5  1  b 150 
##2 2017-1-4  1  b 120 
##3 2017-1-3  1  b 150 
+0

Erstaunlich. Vielen Dank! Eine weitere Sache. Gibt es eine Möglichkeit, nur Unterschiede zu "markieren", die größer als die Summe der ganzen Zahl sind; z. B. größer als 50 (was in meinem Beispiel zu keinen Ergebnissen führen würde)? – staove7

+0

Wenn Sie daran interessiert sind, in jeder Gruppe einen Bereich von 'sum'-Werten zu markieren, die größer als' 50' sind, können Sie 'flag = (max (Summe) -min (Summe)) <= 50' anstelle von' verwenden flag = (Länge (eindeutig (Summe)) == 1) "innerhalb von" mutieren ". Dies wird diejenigen Gruppen festlegen, bei denen der Bereich von "sum" -Werten kleiner oder gleich "50" bis "TRUE" ist, so dass nur diejenigen mit Gruppen mit Bereichen, die größer als "50" sind, beibehalten werden. – aichao

+0

Erstaunlich wieder. Vielen vielen Dank! – staove7

Verwandte Themen