我已经在以前回答过的问题的帮助下写了一些代码。最初我有这个代码:
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))
非常感谢任何帮助。
答案 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_df
和getallT
外部环境的两个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))
)
}