2016-06-14 3 views
0

Рассмотрим следующий пример:Использование dplyr для очистки данных

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) 

Теперь я хочу, чтобы удалить данные, где B значения отличаются более чем 10 по отношению к df1$B[1]

Я попытался следующий код, используя dplyr пакет:

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

И вы хотите сохранить данные, где C == 1? – CClaire

+0

да, пожалуйста. Однако, если это проще, вы можете удалить его – user08041991

ответ

1

Добавьте столбец с разностью ДФ $ B в df1 [1, "B"]

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

С dplyr фильтруйте, чтобы сохранить значение от -10 до 10; и удалить фиктивный столбец, созданный:

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

очень удобный трюк! – user08041991

+1

Вы можете включить 'd' в свой код, используя' mutate'. i.e 'df1%>% mutate (d = B - B [1])%>% filter (d <= 10 & d > = -10)%>% select (-d)' – Sotos

2

Это использует одни и те же идеи и получает вас там:

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

Мы только выделили две проблемы: определение разницы и фильтрации на основе С. двух условия составляют AND вместе filter.

0

Вы можете использовать between:

df1 %>% filter(between((B-B[1]), -10, 10)) # or 
df1 %>% filter((B-B[1]) >= -10 & (B-B[1]) <= 10) 
Смежные вопросы