在dplyr

时间:2018-05-25 22:45:51

标签: r filter dplyr paste

示例数据

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,如果我想保留&gt; =然后ref.day1的日期,我这样做:

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

我想制作3个数据框,每个数据框的行分别由ref.day1ref.day2ref.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 :(得分:1)

您的原始代码不起作用的原因是您的col.names是字符串,但dplyr函数使用不接受字符串的非标准评估。所以你需要将字符串转换为变量。rlang::sym()可以做到这一点 此外,您可以在purrr包中使用map函数,它更加紧凑:

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
Use variable names in functions of dplyr