如何使用 R 中另一个数据帧的起始值和结束值对数据帧中的窗口进行子集化?

mon*_*nis 3 r subset dplyr purrr tidyverse

我有一个时间序列数据的数据框df1,我需要从 R 中提取多个“窗口”。我需要的窗口的起点和终点位于单独数据框 的两列中df2。起点和终点的值对应于所需窗口的行号。

在下面的示例中,我是解决方案的一部分,但目前仅提取第一个窗口。如何修改此示例以提取所有四个窗口?这可能是purrr的情况吗?

library(tidyverse)

# dataframe of data to subset
df1 <- tibble(my_values = rnorm(100))

# dataframe of windows (i.e. row number IDs) to extract from data
df2 <-tibble::tribble(
        ~window_start, ~window_end,
                   3L,         10L,
                  21L,         25L,
                  52L,         63L,
                  78L,         90L
        )

# extracted data
df3 <- df1 %>% 
  slice(df2$window_start : df2$window_end)

Run Code Online (Sandbox Code Playgroud)

(注意。我知道这里有一个类似的问题 -使用另一个数据帧的开始点和停止点对数据帧进行子集化? - 但我的实际数据非常大,我很好奇非基于合并的解决方案是否会更快。)

小智 5

也许尝试这种方法purrr::map2

\n
# dataframe of data to subset\ndf1 <- tibble(my_values = rnorm(100, mean = 45, sd = 30) %>% abs())\n\n# dataframe of windows (i.e. row number IDs) to extract from data\ndf2 <-tibble::tribble(\n  ~window_start, ~window_end,\n  3L,         10L,\n  21L,         25L,\n  52L,         63L,\n  78L,         90L\n)\n\nsubset_thats_in <- function(mini, maxi){\n  df1 %>% \n    filter(between(my_values, mini, maxi))\n}\n\npurrr::map2(df2$window_start, \n            df2$window_end, \n            subset_thats_in)\n
Run Code Online (Sandbox Code Playgroud)\n
[[1]]\n# A tibble: 4 \xc3\x97 1\n  my_values\n      <dbl>\n1      6.47\n2      8.69\n3      7.73\n4      7.35\n\n[[2]]\n# A tibble: 12 \xc3\x97 1\n   my_values\n       <dbl>\n 1      24.2\n 2      22.9\n 3      22.4\n 4      24.4\n 5      22.6\n 6      21.7\n 7      23.2\n 8      21.3\n 9      23.3\n10      21.1\n11      23.5\n12      22.6\n\n[[3]]\n# A tibble: 10 \xc3\x97 1\n   my_values\n       <dbl>\n 1      54.0\n 2      61.4\n 3      62.5\n 4      60.8\n 5      60.5\n 6      55.5\n 7      61.4\n 8      59.0\n 9      57.9\n10      53.3\n\n[[4]]\n# A tibble: 6 \xc3\x97 1\n  my_values\n      <dbl>\n1      87.8\n2      79.1\n3      80.5\n4      82.7\n5      85.2\n6      80.6\n
Run Code Online (Sandbox Code Playgroud)\n