【问题标题】:Split data.frame by column with non-sequential values handled as separate groups按列拆分 data.frame,将非顺序值作为单独的组处理
【发布时间】:2019-04-18 03:46:50
【问题描述】:

您好,我正在尝试根据列拆分 R 中的 data.frame(到 data.frames 列表),但是如果该列中的值发生更改然后返回,它们将被视为单独的组并拆分从彼此。

例如,这里是一个非常简单的可重现示例。

Testdf <- data.frame(x= 1:20,test = rep(c(TRUE,FALSE,TRUE,FALSE),each = 5))

我可以正常分裂:

Testdf %>% split(.$test)

但是从 11:15 开始,TRUEs 1:5 与 TRUEs 分组,我想要相当于

Testdf %>% split(rep(1:4,each = 5))

但我的真实数据非常复杂,没有标准的组大小或类似的东西。

有什么建议吗?

【问题讨论】:

    标签: r dataframe split


    【解决方案1】:

    主要是为split创建适当的组

    另一种方法是使用data.table::rleidsplit

    split(Testdf, data.table::rleid(Testdf$test))
    
    
    #$`1`
    #  x test
    #1 1 TRUE
    #2 2 TRUE
    #3 3 TRUE
    #4 4 TRUE
    #5 5 TRUE
    
    #$`2`
    #    x  test
    #6   6 FALSE
    #7   7 FALSE
    #8   8 FALSE
    #9   9 FALSE
    #.....
    

    如果您只有 TRUE/FALSE 值,则纯 R 替代方案是使用 diff

    split(Testdf, cumsum(c(0, diff(Testdf$test)) != 0))
    

    还有一个rle

    split(Testdf, with(rle(Testdf$test), rep(seq_along(values), lengths)))
    

    【讨论】:

    • 不错。这确实提醒我,我过去曾使用rle 来做类似的事情,但我一直觉得它使用起来很混乱。 data.table::rleid 是一个非常好的选择,我以前从未遇到过,并且会成功。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-11-08
    • 1970-01-01
    • 2012-07-09
    • 2022-01-14
    • 2019-11-05
    • 1970-01-01
    • 2021-08-27
    相关资源
    最近更新 更多