【问题标题】:Is there an R function to extract repeating rows of numbers?是否有一个 R 函数来提取重复的数字行?
【发布时间】:2021-11-17 01:43:36
【问题描述】:

我希望从表中提取时间点。 输出应该是从第 2 列开始的秒数和系列的持续时间。但仅当阶段持续至少 3 分钟时才输出(如果您查看 seconds 列),因此在 stage 列的连续 6 行以上重复阶段 0、1、2、3 或 5。

所以在这种情况下,0 系列不符合条件,而以下 1 系列符合条件。 期望的输出是:150, 8 从时间点 150 开始,持续 8 行。

我正在尝试rle(),但还没有成功..

Stage Seconds
0 0
0 30
0 60
0 90
0 120
1 150
1 180
1 210
1 240
1 270
1 300
1 330
1 360
1 390
0 420

【问题讨论】:

  • 嗨@Slevin!您描述了两个看似不同的保留一组标准:(1)“舞台持续至少 3 分钟”和(2)“重复 [...] 舞台 [...] 超过 6 行”。两者同时为真吗?此外,由于您提到rle,我认为“阶段”的连续 序列很重要。您能否尝试在您的问题中澄清这一点。谢谢!
  • 嘿@Henrik!这两个标准基本上是相同的,只是看两个不同的列,因为重复超过 6 行等于 3 分钟的持续时间。!而且,是的,当然是连续序列,解决了这个问题

标签: r csv


【解决方案1】:

不确定这对您的数据有多大的代表性。这可能是使用dplyr的一个选项

library(dplyr)

df %>% 
  mutate(grp = c(0, cumsum(abs(diff(stage))))) %>% 
  filter(stage == 1) %>% 
  group_by(grp) %>% 
  mutate(count = n() - 1) %>% 
  filter(row_number() == 1, count >= 6) %>% 
  ungroup() %>% 
  select(-c(grp, stage))

#> # A tibble: 4 x 2
#>   seconds count
#>     <dbl> <dbl>
#> 1     960    16
#> 2    1500     7
#> 3    2040    17
#> 4    2670    10

reprex package (v2.0.0) 于 2021 年 9 月 23 日创建

数据

set.seed(123)

df <- data.frame(stage = sample(c(0, 1), 100, replace = TRUE, prob = c(0.2, 0.8)),
                 seconds = seq(0, by = 30, length.out = 100))

【讨论】:

    【解决方案2】:

    类似于this answer,您可以将data.table::rleid()dplyr一起使用

    df <- structure(list(Stage = c(0L, 0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 
                                   1L, 1L, 1L, 1L, 1L, 0L), Seconds = c(0L, 30L, 60L, 90L, 120L, 
                                                                  150L, 180L, 210L, 240L, 270L, 300L, 330L, 360L, 390L, 420L)), class = "data.frame", row.names = c(NA, 
                                                                                                                                                                    -15L))
    library(dplyr)
    library(data.table)
    
    
    df %>%
      filter(Seconds > 0) %>%
      group_by(grp = rleid(Stage)) %>%
      filter(n() > 6)
    #> # A tibble: 9 x 3
    #> # Groups:   grp [1]
    #>   Stage Seconds   grp
    #>   <int>   <int> <int>
    #> 1     1     150     2
    #> 2     1     180     2
    #> 3     1     210     2
    #> 4     1     240     2
    #> 5     1     270     2
    #> 6     1     300     2
    #> 7     1     330     2
    #> 8     1     360     2
    #> 9     1     390     2
    

    reprex package (v2.0.0) 于 2021 年 9 月 23 日创建

    【讨论】:

      猜你喜欢
      • 2019-08-21
      • 2021-03-28
      • 1970-01-01
      • 1970-01-01
      • 2019-12-24
      • 1970-01-01
      • 2020-06-03
      • 1970-01-01
      • 2021-01-14
      相关资源
      最近更新 更多