【问题标题】:Subset 'n' rows with minimum distance of 'd'最小距离为“d”的子集“n”行
【发布时间】:2021-09-01 16:39:38
【问题描述】:

我有一个如下所示的数据框:

dataframe <- data.frame(condition = c("light", "light", "light", "light", "dark", "light", "light", "light", "dark", "light", "light", "dark", 
                                      "light", "light", "light", "dark", "light", "dark", "light", "light", "light", "light", "dark"))

 condition
1      light
2      light
3      light
4      light
5       dark
6      light
7      light
8      light
9       dark
10     light
11     light
12      dark
13     light
14     light
15     light
16      dark
17     light
18      dark
19     light
20     light
21     light
22     light
23      dark

我想对“暗”行之间的“亮”行进行子集化,这些行具有 3 个或更多后续行,其中条件 ==“亮”。例如,我想最终得到:

  condition
1      light
2      light
3      light
4      light
5       dark
6      light
7      light
8      light
9       dark
12      dark
13     light
14     light
15     light
16      dark
18      dark
19     light
20     light
21     light
22     light
23      dark

我该怎么做?提前致谢。

【问题讨论】:

    标签: r select filter dplyr subset


    【解决方案1】:

    我们可以使用data.table中的rleid创建分组列,然后根据条件使用filter

    library(dplyr)
    library(data.table)
    dataframe %>% 
        group_by(grp = rleid(condition)) %>% 
        filter(n() >=3| condition == 'dark') %>%
        ungroup %>%
        select(-grp)
    

    -输出

    # A tibble: 20 x 1
       condition
       <chr>    
     1 light    
     2 light    
     3 light    
     4 light    
     5 dark     
     6 light    
     7 light    
     8 light    
     9 dark     
    10 dark     
    11 light    
    12 light    
    13 light    
    14 dark     
    15 dark     
    16 light    
    17 light    
    18 light    
    19 light    
    20 dark     
    

    或者使用base R中的rle来创建子集的逻辑向量

    subset(dataframe, with(rle(condition),
         rep(lengths >=3|values == 'dark', lengths)))
    

    -输出

        condition
    1      light
    2      light
    3      light
    4      light
    5       dark
    6      light
    7      light
    8      light
    9       dark
    12      dark
    13     light
    14     light
    15     light
    16      dark
    18      dark
    19     light
    20     light
    21     light
    22     light
    23      dark
    

    【讨论】:

    • 两种解决方案都非常有效。谢谢!
    猜你喜欢
    • 2019-02-07
    • 1970-01-01
    • 2014-04-20
    • 2011-02-07
    • 2019-02-21
    • 2021-03-19
    • 1970-01-01
    • 2017-08-30
    相关资源
    最近更新 更多