如何使用tidyverse将数据帧拆分为10行?

如何使用tidyverse将数据帧拆分为10行?,r,tidyverse,tibble,R,Tidyverse,Tibble,我有一个带有每日值的数据框。数据示例如下所示: 数据以编程方式,分为10行和每个TIBLE的第一行。。。value=1是两个不同的东西。我会选择第二个: splitdata,cumsumdata$value==1 $`1` 日分数值 1 1 8 1 2 2 15 0 3 3 8 0 4 4 20 0 5 5 40 0 6 6 1 0 7 7 6 0 $`2` 日分

我有一个带有每日值的数据框。数据示例如下所示:

数据以编程方式,分为10行和每个TIBLE的第一行。。。value=1是两个不同的东西。我会选择第二个:

splitdata,cumsumdata$value==1 $`1` 日分数值 1 1 8 1 2 2 15 0 3 3 8 0 4 4 20 0 5 5 40 0 6 6 1 0 7 7 6 0 $`2` 日分数值 8 8 42 1 9 9 81 0 10 10 18 0 11 11 55 0 12 12 35 0 $`3` 日分数值 13 13 37 1 14 14 85 0 15 15 66 0 16 16 12 0 17 17 32 0 18 18 42 0 19 19 22 0 20 20 64 0 根据艾伦的另一种解释,类似地:

lapplywhichdata$value==1,函数i数据[i:minnrowdata,i+9,] [[1]] 日分数值 1 1 8 1 2 2 15 0 3 3 8 0 4 4 20 0 5 5 40 0 6 6 1 0 7 7 6 0 8 8 42 1 9 9 81 0 10 10 18 0 [[2]] 日分数值 8 8 42 1 9 9 81 0 10 10 18 0 11 11 55 0 12 12 35 0 13 13 37 1 14 14 85 0 15 15 66 0 16 16 12 0 17 17 32 0 [[3]] 日分数值 13 13 37 1 14 14 85 0 15 15 66 0 16 16 12 0 17 17 32 0 18 18 42 0 19 19 22 0 20 20 64 0 以编程方式,分成10行和每个TIBLE的第一行。。。value=1是两个不同的东西。我会选择第二个:

splitdata,cumsumdata$value==1 $`1` 日分数值 1 1 8 1 2 2 15 0 3 3 8 0 4 4 20 0 5 5 40 0 6 6 1 0 7 7 6 0 $`2` 日分数值 8 8 42 1 9 9 81 0 10 10 18 0 11 11 55 0 12 12 35 0 $`3` 日分数值 13 13 37 1 14 14 85 0 15 15 66 0 16 16 12 0 17 17 32 0 18 18 42 0 19 19 22 0 20 20 64 0 根据艾伦的另一种解释,类似地:

lapplywhichdata$value==1,函数i数据[i:minnrowdata,i+9,] [[1]] 日分数值 1 1 8 1 2 2 15 0 3 3 8 0 4 4 20 0 5 5 40 0 6 6 1 0 7 7 6 0 8 8 42 1 9 9 81 0 10 10 18 0 [[2]] 日分数值 8 8 42 1 9 9 81 0 10 10 18 0 11 11 55 0 12 12 35 0 13 13 37 1 14 14 85 0 15 15 66 0 16 16 12 0 17 17 32 0 [[3]] 日分数值 13 13 37 1 14 14 85 0 15 15 66 0 16 16 12 0 17 17 32 0 18 18 42 0 19 19 22 0 20 20 64 0 您可以尝试以下方法:

library(dplyr)
library(tidyverse)
#Create empty var
data %>% mutate(index=NA) -> data
#Define values to split in by define number of rows
i <- seq(1,dim(data)[1],by=10)
j <- 1:length(i)
#Assign values
data$index[i] <- j
#Now fill
data %>% fill(index) %>% group_by(index) %>% mutate(val=1:length(index)) -> data

# A tibble: 20 x 5
# Groups:   index [2]
     day score value index   val
   <int> <dbl> <dbl> <int> <int>
 1     1     8     1     1     1
 2     2    15     0     1     2
 3     3     8     0     1     3
 4     4    20     0     1     4
 5     5    40     0     1     5
 6     6     1     0     1     6
 7     7     6     0     1     7
 8     8    42     1     1     8
 9     9    81     0     1     9
10    10    18     0     1    10
11    11    55     0     2     1
12    12    35     0     2     2
13    13    37     1     2     3
14    14    85     0     2     4
15    15    66     0     2     5
16    16    12     0     2     6
17    17    32     0     2     7
18    18    42     0     2     8
19    19    22     0     2     9
20    20    64     0     2    10
您可以尝试以下方法:

library(dplyr)
library(tidyverse)
#Create empty var
data %>% mutate(index=NA) -> data
#Define values to split in by define number of rows
i <- seq(1,dim(data)[1],by=10)
j <- 1:length(i)
#Assign values
data$index[i] <- j
#Now fill
data %>% fill(index) %>% group_by(index) %>% mutate(val=1:length(index)) -> data

# A tibble: 20 x 5
# Groups:   index [2]
     day score value index   val
   <int> <dbl> <dbl> <int> <int>
 1     1     8     1     1     1
 2     2    15     0     1     2
 3     3     8     0     1     3
 4     4    20     0     1     4
 5     5    40     0     1     5
 6     6     1     0     1     6
 7     7     6     0     1     7
 8     8    42     1     1     8
 9     9    81     0     1     9
10    10    18     0     1    10
11    11    55     0     2     1
12    12    35     0     2     2
13    13    37     1     2     3
14    14    85     0     2     4
15    15    66     0     2     5
16    16    12     0     2     6
17    17    32     0     2     7
18    18    42     0     2     8
19    19    22     0     2     9
20    20    64     0     2    10

如果我理解正确,您需要从每个值1开始的10个连续行,无论接下来的10行中是否还有包含1的元素。这不是分割数据帧,而是选择多个重叠子集。这可以通过Lappy实现——它不需要额外的软件包。唯一的问题是,如果在距离终点10行内有1,则将有NA行:

lapply(seq(sum(data$value)), function(i) data[which(data$value == 1)[i] + 0:9,])
#> [[1]]
#>    day score value
#> 1    1     8     1
#> 2    2    15     0
#> 3    3     8     0
#> 4    4    20     0
#> 5    5    40     0
#> 6    6     1     0
#> 7    7     6     0
#> 8    8    42     1
#> 9    9    81     0
#> 10  10    18     0
#> 
#> [[2]]
#>    day score value
#> 8    8    42     1
#> 9    9    81     0
#> 10  10    18     0
#> 11  11    55     0
#> 12  12    35     0
#> 13  13    37     1
#> 14  14    85     0
#> 15  15    66     0
#> 16  16    12     0
#> 17  17    32     0
#> 
#> [[3]]
#>      day score value
#> 13    13    37     1
#> 14    14    85     0
#> 15    15    66     0
#> 16    16    12     0
#> 17    17    32     0
#> 18    18    42     0
#> 19    19    22     0
#> 20    20    64     0
#> NA    NA    NA    NA
#> NA.1  NA    NA    NA

如果我理解正确,您需要从每个值1开始的10个连续行,无论接下来的10行中是否还有包含1的元素。这不是分割数据帧,而是选择多个重叠子集。这可以通过Lappy实现——它不需要额外的软件包。唯一的问题是,如果在距离终点10行内有1,则将有NA行:

lapply(seq(sum(data$value)), function(i) data[which(data$value == 1)[i] + 0:9,])
#> [[1]]
#>    day score value
#> 1    1     8     1
#> 2    2    15     0
#> 3    3     8     0
#> 4    4    20     0
#> 5    5    40     0
#> 6    6     1     0
#> 7    7     6     0
#> 8    8    42     1
#> 9    9    81     0
#> 10  10    18     0
#> 
#> [[2]]
#>    day score value
#> 8    8    42     1
#> 9    9    81     0
#> 10  10    18     0
#> 11  11    55     0
#> 12  12    35     0
#> 13  13    37     1
#> 14  14    85     0
#> 15  15    66     0
#> 16  16    12     0
#> 17  17    32     0
#> 
#> [[3]]
#>      day score value
#> 13    13    37     1
#> 14    14    85     0
#> 15    15    66     0
#> 16    16    12     0
#> 17    17    32     0
#> 18    18    42     0
#> 19    19    22     0
#> 20    20    64     0
#> NA    NA    NA    NA
#> NA.1  NA    NA    NA
我们还可以通过使用gl创建一个组进行拆分

我们还可以通过使用gl创建一个组进行拆分


谢谢这正是我想要的。谢谢!这正是我想要的。