Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在R中的同一个函数中创建多个过滤器?_R_Function_Dataframe_Filter_Dplyr - Fatal编程技术网

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

如何在R中的同一个函数中创建多个过滤器?,r,function,dataframe,filter,dplyr,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( da

我已经编写了一些代码来帮助回答前面回答的问题。最初我有以下代码:

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))
}
我想按时间过滤它,所以我使用了这个代码(感谢下面的帖子):

但现在我遇到了一个问题,所以现在我想知道如何: A.过滤掉数字4和5,这样我就可以用不同的
时间为它创建一个单独的函数。稍后创建另一个不同的函数,将前面的两个函数合并为一个函数。
或
B.为同一函数中的数字4和5创建不同的
时间
过滤器

我试着使用
过滤器(getallT,Number>=3)%>%
来做A,但不起作用。如果可能的话,我宁愿和B一起去。所以有点像。。。 对于ID号1-3:过滤器(!介于(时间,1,2))之间 对于ID号4-5:同一函数内的过滤器(!between(Time 1.5,2.3))。 在过去的一天里,我一直在尝试一些事情,但不断收到错误消息,例如过滤器impl(.data,quo)中的
错误:
计算错误:只能对数字、逻辑或复杂类型执行操作。

我一直在尝试什么是在这里,但不能做什么写,所以需要一些洞察力!

下面是一个示例数据集

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))

df此函数有些混乱:

getHLN <- function(df, ID) {
  data_df1 <- getT(race_df)
  subset(x = getallT, subset = (ID)) %>%
    filter (!between(Time, 1.50, 2.10))
}
我们可以通过在%…&!中创建
ID%来完成您描述的过滤!between()
逻辑用于您描述的两组条件,将每一组条件都用括号括起来,以便将它们计算为“and”逻辑,然后将它们添加到
filter
函数中,并将它们与
运算符(“or”)连接起来,
filter
将计算为“filter df where(条件a和B)或(标准c和d)”

getHLN%过滤器(
(在%1:3和(时间,1,2)之间的数字%|
(数字%在%4:5和之间(时间,1.50,2.10))
)
}

你能提供一个小的可复制的例子吗?请养成习惯,因为你会问一些关于包含可复制数据集的问题。我确实有一个坏习惯,就是忘了添加这些数据!呜呜,谢谢你的提醒!当我进一步摆弄时,我意识到我的数据毫无意义,但现在你给我看了一个更流畅的代码,为此我表示感谢你。我自学了R,对一般编程也不熟悉。我相信你可以告诉我。有没有办法我可以添加另一个与时间相关的
过滤器
,只需
数字
4和5?我一直收到相同的错误消息。啊,是的,我重新阅读了你的问题,现在看看你希望做什么-请看我的答案修改后的答案。谢谢你的帮助!我的代码看起来更好了,现在可以使用了!
  ID Number Time Distance
1 33      3 0.82      305
2 33      4 2.02      651
3 33      5 2.53      502
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))
getHLN <- function(df, ID) {
  data_df1 <- getT(race_df)
  subset(x = getallT, subset = (ID)) %>%
    filter (!between(Time, 1.50, 2.10))
}
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))
}
getHLN <- function(df) {
  df %>% filter(
    (Number %in% 1:3 & !between(Time, 1, 2)) |
      (Number %in% 4:5 & !between(Time, 1.50, 2.10))
    )
}