我有一个每日价值的数据框架。数据示例如下所示:
data<-data.frame(day=c(1:20), score=c(8,15,8,20,40,1,6,42,81,18,55,35,37,85,66,12,32,42,22,64), value=c(1,0,0,0,0,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0))
实际数据集包括大约2000行。
我希望能够将数据帧分割成碎片。每只老虎将由10行组成。每个tibble的第一行都是值= 1的时候。
因此,某些行将在多个tibble中表示。
使用tidyverse包可以做到这一点吗?
提前谢谢。
发布于 2020-07-13 16:55:16
如果我正确理解,您希望从1的每个值开始连续10行,无论接下来的10行中是否有包含1的更多元素。这不是分割数据帧,而是选择多个重叠子集。这可以通过lapply实现--它不需要额外的包。唯一的问题是,如果在结束后的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发布于 2020-07-13 16:43:39
从编程上讲,“拆分为10行”和“每个tibble =1的第一行”是两件不同的事情。我要说第二条:
split(data, cumsum(data$value == 1))
# $`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
# $`2`
# day score value
# 8 8 42 1
# 9 9 81 0
# 10 10 18 0
# 11 11 55 0
# 12 12 35 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对于Allan的替代解释,类似地:
lapply(which(data$value == 1), function(i) data[i:min(nrow(data), i+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发布于 2020-07-13 16:46:40
你可以试试这个:
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 10https://stackoverflow.com/questions/62880335
复制相似问题