Отфильтруйте значения относительно значений в другом столбце, используя dplyr - PullRequest
2 голосов
/ 17 октября 2019

У меня есть столбец в кадре данных, и я хотел бы отфильтровать все строки, которые превышают или меньше двух стандартных отклонений от среднего.

В качестве примера я хотел бы получить из этого две строки (только те строки, которые попадают между минимальным и высоким стандартными отклонениями:

group    value    low_sd    high_sd    
a          4        2          8
a          1        2          8
b          6        4          9
b          12       4          9

Я надеялся использовать dplyr::between.

clean_df <- df%>%
  filter(between(value, low_sd, high_sd))  

Но, похоже, between принимает только числовые значения.

Ответы [ 2 ]

4 голосов
/ 17 октября 2019

between не векторизовано для значений left, right. Вместо этого это можно сделать, используя только операторы сравнения (>/<)

library(dplyr)
df %>% 
    filter(value > low_sd, value <= high_sd)
#    group value low_sd high_sd
#1     a     4      2       8
#2     b     6      4       9

Но если мы обернемся с Vectorize, это будет работать также

df %>% 
   filter(Vectorize(dplyr::between)(value, low_sd, high_sd))
#    group value low_sd high_sd
#1     a     4      2       8
#2     b     6      4       9

данные

df <- structure(list(group = c("a", "a", "b", "b"), value = c(4L, 1L, 
6L, 12L), low_sd = c(2L, 2L, 4L, 4L), high_sd = c(8L, 8L, 9L, 
9L)), class = "data.frame", row.names = c(NA, -4L))
3 голосов
/ 17 октября 2019

В качестве альтернативы, вы можете использовать between() из data.table:

df %>%
 filter(data.table::between(value, low_sd, high_sd))

  group value low_sd high_sd
1     a     4      2       8
2     b     6      4       9

или если вы хотите придерживаться только dplyr:

df %>%
 rowwise() %>%
 filter(dplyr::between(value, low_sd, high_sd))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...