【问题标题】:Filter using paste and name in dplyr在 dplyr 中使用粘贴和名称进行过滤
【发布时间】:2018-05-26 07:01:08
【问题描述】:

样本数据

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

【问题讨论】:

    标签: r filter dplyr paste


    【解决方案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

    【讨论】:

      猜你喜欢
      • 2018-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-18
      相关资源
      最近更新 更多