如何在R中的同一函数中创建多个过滤器?

时间:2017-07-08 14:11:47

标签: r function dataframe filter dplyr

我已经在以前回答过的问题的帮助下写了一些代码。最初我有这个代码:

getT <- function(df, ID, Number){
  df %>%
    group_by(ID, Number) %>% 
    mutate( Distance = finish - begin) %>% 
    select(-begin,-finish,-symbols) %>%
    nest() %>% 
    mutate( data = map( data, ~ filter(.x, Distance == max(Distance)))) %>% 
    unnest()
}

getallT <- as.data.frame(getT(df))

getTID <- function(df, ID) {
  subset(x = getallT, subset = (ID))
}

这给出了这个输出:

ID     Number     Time     Distance
33         1      2.00         870
33         2      1.98         859
33         3      0.82         305
33         4      2.02         651
33         5      2.53         502

我想按Time过滤它,所以我使用了这段代码(感谢下面的帖子):

getHLN <- function(df, ID) {
  getallT %>% filter (ID ==id & !between(Time, 1.50, 2.10))
}

现在提供此输出:

  ID Number Time Distance
1 33      3 0.82      305
2 33      4 2.02      651
3 33      5 2.53      502

但现在我遇到了一个问题,所以现在我想知道如何: A.过滤掉4号和4号5这样我就可以使用不同的Time过滤器创建一个单独的函数。稍后创建另一个不同的函数将前两个函数合并为一个。 要么 B.专门为4号和4号专家创建一个不同的Time过滤器。 5在同一个功能中。

我尝试使用filter (getallT, Number >= 3) %>%做A.但不起作用。如果可能的话,我宁愿和B一起去。所以像...... 对于ID号1-3:过滤器(!(时间,1,2)之间) 对于ID号4-5:在同一功能内过滤(!(时间1.5,2.3)之间)。 我过去一天尝试了一些事情,但不断收到Error in filter_impl(.data, quo) : Evaluation error: operations are possible only for numeric, logical or complex types.

等错误消息

我一直在尝试在这里做什么,但一定不要写点什么,所以需要一些见解! http://genomicsclass.github.io/book/pages/dplyr_tutorial.html

这是一个示例数据集

df <- data.frame(ID=rep(33,5),
                 Number=1:5,
                 Time=c(2.00,1.98,0.82,2.02,2.53),
                 Distance=c(870,859,305,651,502))

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

这个功能有些令人困惑:

getHLN <- function(df, ID) {
  data_df1 <- getT(race_df)
  subset(x = getallT, subset = (ID)) %>%
    filter (!between(Time, 1.50, 2.10))
}

主要是因为它需要一个df参数,它不在其中,并使用来自race_dfgetallT外部环境的两个data.frames。您拨打subset的电话也有点神秘。就目前而言,该函数将返回以subset开头的表达式返回的任何内容,并将丢弃data_df1

getHLN <- function(df, ID) {
  # this gets locally assigned within the function and then 
  # becomes unreachable once the function ends
  data_df1 <- getT(df)
  # this expression would produce the last value of the function
  # and so the function would return its value
  subset(x = getallT, subset = (ID)) %>%
    filter (!between(Time, 1.50, 2.10))
}

我们可以通过为您描述的两组标准创建ID %in% ... & !between()逻辑来进行所描述的那种过滤,将每个标准包装在括号中,以便将它们评估为“和”逻辑,然后将两者都添加到filter函数并将其与|运算符(“或”)联接起来,filter将评估为“过滤器df其中(标准a AND B)OR(标准c和d) ”

getHLN <- function(df) {
  df %>% filter(
    (Number %in% 1:3 & !between(Time, 1, 2)) |
      (Number %in% 4:5 & !between(Time, 1.50, 2.10))
    )
}