2017-10-18 5 views
1

Für eine bestimmte Datentabelle siehe Beispiel unten, ich möchte nur Differenz Spalte für Werte größer als 2 von Unique_ID, ohne die NA-Zeilen zu löschen.Subset verzögerte Werte in R

My_data_table <- structure(list(Unique_ID = structure(c(1L, 1L, 2L, 2L, 3L, 
        3L, 3L, 4L, 4L, 4L), .Label = c("1AA", "3AA", "5AA", "6AA"), 
        class = "factor"), Distance.km. = c(1, 2.05, 2, 4, 2, 4, 7, 
        8, 9, 10), Difference = c(NA, 1.05, NA, 2, NA, 2, 3, NA, 1, 1)), 
        .Names = c("Unique_ID", "Distance.km.", "Difference"), 
        class = "data.frame", row.names = c(NA, -10L)) 
My_data_table 
Unique_ID Distance(km) Difference  
1AA  1    NA   
1AA  2.05   1.05   
3AA  2    NA   
3AA  4    2   
5AA  2    NA   
5AA  4    2   
5AA  7    3 
6AA  8    NA 
6AA  9    1 
6AA  10   1 

Hier ist das Ergebnis i

gesucht bin
 My_data_table 
Unique_ID Distance(km) Difference    
3AA  2    NA   
3AA  4    2   
5AA  2    NA   
5AA  4    2   
5AA  7    3 
+1

Was Sie bisher versucht haben? –

+0

Warum ist dieser Eintrag dort '5AA 2 NA' –

Antwort

3

Nach der Umstellung auf 'data.table' (setDT(df1)), gruppiert nach 'Unique_ID', if die sum logischer Vektor (Difference >= 2) größer als 0 ist, dann erhalten die Teilmenge von Data.table (.SD), wo die entweder ‚Difference‘ ein NA oder | ist es größer als oder gleich 2

library(data.table) 
setDT(df1)[, if(sum(Difference >=2, na.rm = TRUE)>0) 
       .SD[is.na(Difference)|Difference>=2], by = Unique_ID] 
#  Unique_ID Distance.km. Difference 
#1:  3AA   2   NA 
#2:  3AA   4   2 
#3:  5AA   2   NA 
#4:  5AA   4   2 
#5:  5AA   7   3 
0

A dplyr Lösung:

library(dplyr) 

df %>% 
    group_by(Unique_ID) %>% 
    filter(any(Difference >= 2 & !is.na(Difference))) 
# # A tibble: 5 x 3 
# # Groups: Unique_ID [2] 
# Unique_ID Distance.km. Difference 
#  <fctr>  <dbl>  <dbl> 
# 1  3AA   2   NA 
# 2  3AA   4   2 
# 3  5AA   2   NA 
# 4  5AA   4   2 
# 5  5AA   7   3