Фильтр с использованием вставки и имени в dplyr - PullRequest
0 голосов
/ 26 мая 2018

Пример данных

df <- data.frame(loc.id = rep(1:5, each = 6), day = sample(1:365,30), 
                       ref.day1 = rep(c(20,30,50,80,90), each = 6),
                       ref.day2 = rep(c(10,28,33,49,67), each = 6),
                       ref.day3 = rep(c(31,49,65,55,42), each = 6))

Для каждого loc.id, если я хочу сохранить дни>> = ref.day1, я делаю это:

df %>% group_by(loc.id) %>% dplyr::filter(day >= ref.day1)

Я хочучтобы сделать 3 фрейма данных, каждый из которых строки фильтруются по ref.day1, ref.day2, ref.day3 соответственно

Я попытался это:

col.names <- c("ref.day1","ref.day2","ref.day3")
temp.list <- list()
for(cl in seq_along(col.names)){

    col.sub <- col.names[cl] 
    columns <- c("loc.id","day",col.sub)

    df.sub <- df[,columns]
    temp.dat <- df.sub %>% group_by(loc.id) %>% dplyr::filter(day >= paste0(col.sub)) # this line does not work
    temp.list[[cl]] <- temp.dat
}

final.dat <- rbindlist(temp.list)

Мне было интересно, как обратиться кстолбцы по именам и вставьте функцию в dplyr, чтобы отфильтровать его.

1 Ответ

0 голосов
/ 26 мая 2018

Причина, по которой ваш оригинальный код не работает, заключается в том, что ваши имена col.name являются строками, но функция dplyr использует нестандартную оценку, которая не принимает строки.Поэтому вам нужно преобразовать строку в переменные. rlang::sym() может сделать это.
Кроме того, вы можете использовать функцию map в пакете purrr, который гораздо компактнее:

library(dplyr)
library(purrr)
col_names <- c("ref.day1","ref.day2","ref.day3")
map(col_names,~ df %>% dplyr::filter(day >= UQ(rlang::sym(.x))))
#it will return you a list of dataframes

Кстати, яудалены group_by(), поскольку они не кажутся полезными.

Возвращенный результат:

    [[1]]
    loc.id day ref.day1 ref.day2 ref.day3
    1       1 362       20       10       31
    2       1  69       20       10       31
    3       1  65       20       10       31
    4       1  88       20       10       31
    5       1 142       20       10       31
    6       2 355       30       28       49
    7       2 255       30       28       49
    8       2 136       30       28       49
    9       2 156       30       28       49
    10      2 194       30       28       49
    11      2 204       30       28       49
    12      3 129       50       33       65
    13      3 254       50       33       65
    14      3 279       50       33       65
    15      3 201       50       33       65
    16      3 282       50       33       65
    17      4 351       80       49       55
    18      4 114       80       49       55
    19      4 338       80       49       55
    20      4 283       80       49       55
    21      5 199       90       67       42
    22      5 141       90       67       42
    23      5 241       90       67       42
    24      5 187       90       67       42

    [[2]]
    loc.id day ref.day1 ref.day2 ref.day3
    1       1  16       20       10       31
    2       1 362       20       10       31
    3       1  69       20       10       31
    4       1  65       20       10       31
    5       1  88       20       10       31
    6       1 142       20       10       31
    7       2 355       30       28       49
    8       2 255       30       28       49
    9       2 136       30       28       49
    10      2 156       30       28       49
    11      2 194       30       28       49
    12      2 204       30       28       49
    13      3 129       50       33       65
    14      3 254       50       33       65
    15      3 279       50       33       65
    16      3 201       50       33       65
    17      3 282       50       33       65
    18      4 351       80       49       55
    19      4 114       80       49       55
    20      4 338       80       49       55
    21      4 283       80       49       55
    22      4  79       80       49       55
    23      5 199       90       67       42
    24      5  67       90       67       42
    25      5 141       90       67       42
    26      5 241       90       67       42
    27      5 187       90       67       42

    [[3]]
    loc.id day ref.day1 ref.day2 ref.day3
    1       1 362       20       10       31
    2       1  69       20       10       31
    3       1  65       20       10       31
    4       1  88       20       10       31
    5       1 142       20       10       31
    6       2 355       30       28       49
    7       2 255       30       28       49
    8       2 136       30       28       49
    9       2 156       30       28       49
    10      2 194       30       28       49
    11      2 204       30       28       49
    12      3 129       50       33       65
    13      3 254       50       33       65
    14      3 279       50       33       65
    15      3 201       50       33       65
    16      3 282       50       33       65
    17      4 351       80       49       55
    18      4 114       80       49       55
    19      4 338       80       49       55
    20      4 283       80       49       55
    21      4  79       80       49       55
    22      5 199       90       67       42
    23      5  67       90       67       42
    24      5 141       90       67       42
    25      5 241       90       67       42
    26      5 187       90       67       42

Вы также можете проверить это:
https://dplyr.tidyverse.org/articles/programming.html
Использовать имена переменных в функциях dplyr

...