Итеративный фильтр данных с изменяющимся условием - PullRequest
1 голос
/ 04 октября 2019

Я хочу создать много фреймов данных на основе условия фильтрации. Недавно я попытался улучшить свои навыки с помощью R, и в частности, подходов к функциональному программированию.

Ниже представлен метод копирования / вставки для получения того, что я хочу - различные кадры данных, которые будут проанализированы после некоторогоусловия фильтрации были применены на основе столбца в кадре данных. Очевидно, что это нецелесообразно для произвольного множества условий фильтрации.

library(tidyverse)

df = tibble(a = rnorm(5000, mean = 500, sd = 20),
            b = rep(c('a', 'b', 'c', 'd'), 5000/4))

thresholds = c(400, 450, 500, 550)


df_400 = df %>% filter(a < 400)
df_450 = df %>% filter(a < 450)
df_500 = df %>% filter(a < 500)
df_550 = df %>% filter(a < 550)

Я пробовал варианты с использованием map2, но я не уверен, как изменять строки данных, а также основывать на них условие,Я чувствую, что упускаю что-то простое.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Как я добавил в своем комментарии, это ответ с использованием подхода r и dplyr.

dplyr

map(thresholds, ~df %>% filter(a < .x))

база r

lapply(thresholds, function(x){df[df[["a"]] < x, ]})

1 голос
/ 04 октября 2019

Одним из способов может быть:

lapply(thresholds, function(x) filter(df, a < x))

[[1]]
# A tibble: 0 x 2
# … with 2 variables: a <dbl>, b <chr>

[[2]]
# A tibble: 22 x 2
       a b    
   <dbl> <chr>
 1  440. c    
 2  448. c    
 3  445. d    
 4  443. b    
 5  443. a    
 6  448. d    
 7  435. a    
 8  438. b    
 9  447. c    
10  444. c    
# … with 12 more rows

Если вы хотите сохранить его полностью в терминах tidyverse, тогда посмотрите на хороший комментарий от @Johan Rosa.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...