如何在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))
)
}