首页 > 解决方案 > 在 dplyr 中使用粘贴和名称进行过滤

问题描述

样本数据

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.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 中按名称和粘贴函数引用列以将其过滤掉。

标签: rfilterdplyrpaste

解决方案


您的原始代码不起作用的原因是您的 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 在 dplyr 的函数中使用变量名


推荐阅读