【发布时间】:2021-07-01 16:20:55
【问题描述】:
您好,我正在使用 slide_index() 为数据帧中的每一行捕获时间窗口中的值。但是,对于每一行,我还将比较当前行的值与该行窗口的捕获值。我使用的部分逻辑要求在每行迭代期间从捕获的值中排除当前行的值。
我认为有两种方法可以解决这个问题:1. 我可以将当前行的值直接传递到我在 slide_index(.f) 中使用的自定义函数逻辑中,或者 2. 我可以排除当前行的为该行的滑动窗口捕获的值中的值。第一条路线我找不到任何资源,所以我想知道第二条路线是否可行。
library(slider)
x <- c(rep(1:16))
i <- as.Date("2019-08-15") + c(0:15)
slide_index(x, i, ~.x, .before = 2, .after = 2)
例如,当 x = 2 时,在第二次迭代中关闭 slide_index() 输出上方的可重现代码将是:[1] 1 2 3 4。但我希望输出仅返回 [1 ] 1 3 4,或者获取一种将当前 x 值读入我将传递给 slide_index(.f) 的自定义函数的方法
编辑: group_by 的第二个示例
library(slider)
library(tidyverse)
x <- c(10, 12, 12, 14, 11, 22, 25, 25, 33, 31, 34, 36, 23, 24, 29, 13)
y <- c(10, 12, 12, 14, 11, 22, 25, 25, 33, 31, 34, 36, 23, 24, 29, 13)
group <- c(rep(as.character('A'), 5), rep(as.character('B'), 4), rep(as.character('C'), 1), rep(as.character('D'), 6))
df <- data.frame(group, x, y, dates) %>%
mutate(group = as.factor(group))
df %>%
group_by(group) %>%
do(mutate(., result = slide_index(.x = ., .i = .$dates, ~median(.$y), .before = 2, .after = 2)
%>% unlist()
)
)
我也试过了,但是没用
df %>%
group_by(group) %>%
do(mutate(., result = max(map2(slide_index(.x = seq_along(.), .i = .$dates, .f = ~.$y, .before = 2, .after = 2), seq_along(.), ~.[setdiff(.x, .y)] )
)
)
)
【问题讨论】:
-
第一个元素怎么样 - 是 2、3 吗?
-
如果您运行代码,在第一次迭代时 x = 1 时,slide_index 的输出为 [1] 1 2 3。所以我的目标是将该输出更改为 [1] 2 3.
-
在
slide_index中使用map2(slide_index(x, i, ~.x, .before = 2, .after = 2), x, setdiff)更容易删除该元素,它比map2代码需要更多的努力 -
这可以工作,但如果 x 向量中有重复项,那么 setdiff 不会省略这些重复项吗?我的目标不是一定要防止在当前 x 元素和输出中弹出相同的值,而是要确保当前 x 元素不会重复计算并包含在输出中。
-
例如:
library(slider) x <- c(c(1, 2, 2),rep(4:16)) i <- as.Date("2019-08-15") + c(0:15) slide_index(x, i, ~.x, .before = 2, .after = 2)我希望第二次迭代(当 x = 2 时)的输出为 [1] 1 2 4 而不是 [1] 1 2 2 4
标签: r sliding-window