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 loop
或 lapply
?
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= 的行]?
使用 split
和 1: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
我目前有以下 data frame
,我正在尝试开发一个包含 5 个独特 data frames
的列表,其中包含原始 df
的每 5 行。有没有办法每隔 5 行 select 并将其添加到列表中的新数据框中?使用 for loop
或 lapply
?
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= 的行]?
使用 split
和 1: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