2016-06-14 3 views
0

Nehmen Sie das folgende Beispiel:dplyr Mit den Daten zu reinigen

set.seed(123456) 
A <- 1:500 
B <- sample(1:50, 500, replace = T) 
C <- rep(0,500) 
df1 <- data.frame(A,B,C) 
df1$C[1] <- 1 

library(dplyr) 

Jetzt möchte ich die Daten entfernen, wo die B Werte mehr als 10 relativ unterscheiden zu df1$B[1]

ich den folgenden Code versucht haben, mit der dplyr Paket:

diff_in_B_less_than_10 <- df1 %>% 
    filter(abs(B[C == 1] - B[C == 0]) <= 10) 
+0

Und Sie die Daten behalten möchten, wo C == 1? – CClaire

+0

ja, bitte. Aber wenn es einfacher ist, können Sie es – user08041991

Antwort

1

Fügen Sie eine Spalte mit Unterschied von df $ B df1 [1, "B"]

df1$d <- df1$B - df1[1,"B"] 

Mit dplyr, Filter, um einen Wert zwischen -10 und 10 zu behalten; und entfernen Sie die Dummy-Spalte erstellt:

df2<-df1 %>% filter(d <= 10 & d >=-10) %>% select(-d) 
+0

sehr handlichen Trick entfernen! – user08041991

+1

Sie können 'd' in Ihren Code einfügen, indem Sie' mutate' verwenden. d. h. df1%>% mutieren (d = B - B [1])%>% filter (d <= 10 & d > = -10)%>% select (-d) ' – Sotos

2

Diese verwendet die gleichen Ideen und bringt Sie dort:

diff_in_B_less_than_10 <- df1 %>% filter(abs(B - df1$B[[1]]) <= 10, C==0) 

Wir haben gerade die beiden Anliegen ausgesondert: Bestimmen der Differenz und Filterung basierend auf C. Die beiden Die Bedingungen werden zusammen mit filter UND-verknüpft.

0

können Sie between verwenden:

df1 %>% filter(between((B-B[1]), -10, 10)) # or 
df1 %>% filter((B-B[1]) >= -10 & (B-B[1]) <= 10)