首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用tidyverse将数据帧拆分为10行?

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

Stack Overflow用户
提问于 2020-07-13 16:38:46
回答 4查看 561关注 0票数 1

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

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包可以做到这一点吗?

提前谢谢。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2020-07-13 16:55:16

如果我正确理解,您希望从1的每个值开始连续10行,无论接下来的10行中是否有包含1的更多元素。这不是分割数据帧,而是选择多个重叠子集。这可以通过lapply实现--它不需要额外的包。唯一的问题是,如果在结束后的10行中有1,则会有NA行:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2020-07-13 16:43:39

从编程上讲,“拆分为10行”和“每个tibble =1的第一行”是两件不同的事情。我要说第二条:

代码语言:javascript
复制
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的替代解释,类似地:

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2020-07-13 16:46:40

你可以试试这个:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62880335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档