Select 每隔第 n 行数据框并添加到 R 中的数据框列表

Select every other nth row of data frame and add to a list of data frames in R

我目前有以下 data frame,我正在尝试开发一个包含 5 个独特 data frames 的列表,其中包含原始 df 的每 5 行。有没有办法每隔 5 行 select 并将其添加到列表中的新数据框中?使用 for looplapply?

df
X1 X2 X3     X4 X5
1  0 0 1.501990  0
2  0 0 1.883904  0
3  0 0 1.333195  0
4  0 0 0.000000  0
5  0 0 2.136760  0
6  0 0 2.186790  0
7  0 0 1.269592  0
8  0 0 1.458405  0
9  0 0 1.816493  0
10 0 0 0.000000  0
11 0 0 2.190029  0
12 0 0 0.000000  0
13 0 0 1.460534  0
14 0 0 1.470776  0
15 0 0 1.675406  0
16 0 0 1.842470  0
17 0 0 1.937999  0
18 0 0 0.000000  0
19 0 0 1.649926  0
20 0 0 2.067902  0

例如,第一个 data frame 将由第 1、6、11 和 16 行组成,而下一个将从第 2 行开始并继续向下 [=14= 的行]?

使用 split1:5 创建具有 5 行间隔的数据帧。

split(df, 1:5)

输出

$`1`
   X1 X2 X3       X4 X5
1   1  0  0 1.501990  0
6   6  0  0 2.186790  0
11 11  0  0 2.190029  0
16 16  0  0 1.842470  0

$`2`
   X1 X2 X3       X4 X5
2   2  0  0 1.883904  0
7   7  0  0 1.269592  0
12 12  0  0 0.000000  0
17 17  0  0 1.937999  0

$`3`
   X1 X2 X3       X4 X5
3   3  0  0 1.333195  0
8   8  0  0 1.458405  0
13 13  0  0 1.460534  0
18 18  0  0 0.000000  0

$`4`
   X1 X2 X3       X4 X5
4   4  0  0 0.000000  0
9   9  0  0 1.816493  0
14 14  0  0 1.470776  0
19 19  0  0 1.649926  0

$`5`
   X1 X2 X3       X4 X5
5   5  0  0 2.136760  0
10 10  0  0 0.000000  0
15 15  0  0 1.675406  0
20 20  0  0 2.067902  0

dplyr::group_split 的替代方案是:

group_split(df, rep(1:5, nrow(df)/5), .keep = F)

数据

df <- structure(list(X1 = 1:20, X2 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L), X3 = c(0L, 
0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
0L, 0L, 0L), X4 = c(1.50199, 1.883904, 1.333195, 0, 2.13676, 
2.18679, 1.269592, 1.458405, 1.816493, 0, 2.190029, 0, 1.460534, 
1.470776, 1.675406, 1.84247, 1.937999, 0, 1.649926, 2.067902), 
    X5 = c(0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 0L, 0L, 0L, 0L, 0L)), class = "data.frame", row.names = c(NA, 
-20L))

可能的解决方案,基于dplyr::group_split

library(dplyr)

df %>% 
  mutate(id = 0:(nrow(df)-1) %% 4) %>% 
  group_by(id) %>% 
  group_split(.keep = F) %>% 
  as.list

#> [[1]]
#> # A tibble: 5 × 5
#>      X1    X2    X3    X4    X5
#>   <int> <int> <int> <dbl> <int>
#> 1     1     0     0  1.50     0
#> 2     5     0     0  2.14     0
#> 3     9     0     0  1.82     0
#> 4    13     0     0  1.46     0
#> 5    17     0     0  1.94     0
#> 
#> [[2]]
#> # A tibble: 5 × 5
#>      X1    X2    X3    X4    X5
#>   <int> <int> <int> <dbl> <int>
#> 1     2     0     0  1.88     0
#> 2     6     0     0  2.19     0
#> 3    10     0     0  0        0
#> 4    14     0     0  1.47     0
#> 5    18     0     0  0        0
#> 
#> [[3]]
#> # A tibble: 5 × 5
#>      X1    X2    X3    X4    X5
#>   <int> <int> <int> <dbl> <int>
#> 1     3     0     0  1.33     0
#> 2     7     0     0  1.27     0
#> 3    11     0     0  2.19     0
#> 4    15     0     0  1.68     0
#> 5    19     0     0  1.65     0
#> 
#> [[4]]
#> # A tibble: 5 × 5
#>      X1    X2    X3    X4    X5
#>   <int> <int> <int> <dbl> <int>
#> 1     4     0     0  0        0
#> 2     8     0     0  1.46     0
#> 3    12     0     0  0        0
#> 4    16     0     0  1.84     0
#> 5    20     0     0  2.07     0