gpt4 book ai didi

r cumsum-like 函数,用于分割数据帧

转载 作者:行者123 更新时间:2023-12-05 00:59:23 26 4
gpt4 key购买 nike

给定以下数据框:

mydf <- data.frame(x=c(1:10,10:1),y=c(10:1,1:10))

怎么可能 split这样每个子数据帧都会有一个列的连续值大于另一列?

例如在 mydf ,我希望的结果是 split将其放入三个数据帧中:
  • (y > x; 应该包含 mydf 的前 5 行)
  • (x > y; 应该包含 mydf 的第 6 到 15 行)
  • (再次 y > x;应该包含 mydf 的最后 5 行)

  • 我尝试使用以下代码,但它产生了不好的结果,其中每个 y > x 将被单独拆分;此外,其中 x > y 的数据帧将在第一行中包含 y > x:
    split(mydf, cumsum(mydf$x > mydf$y))

    我尝试做的另一个不太优雅的方法是 sapply与个人 if split里面的s功能,但由于性能问题,我不想走这条路。

    最佳答案

    尝试

    rl <- with(mydf, rle(x >y))
    grp <- inverse.rle(within.list(rl , values <- seq_along(values)))
    split(mydf, grp)
    #$`1`
    # x y
    #1 1 10
    #2 2 9
    #3 3 8
    #4 4 7
    #5 5 6

    #$`2`
    # x y
    #6 6 5
    #7 7 4
    #8 8 3
    #9 9 2
    #10 10 1
    #11 10 1
    #12 9 2
    #13 8 3
    #14 7 4
    #15 6 5

    #$`3`
    # x y
    #16 5 6
    #17 4 7
    #18 3 8
    #19 2 9
    #20 1 10

    或者
    group <-  with(mydf, cumsum(c(1,abs(diff(x >y)))))
    split(mydf, group)

    或者您可以使用 rleid来自 data.table 的开发版(来自@David Arenburg 的评论),即 v1.9.5 .安装说明是 here
     library(data.table)
    split(mydf, rleid(with(mydf, y > x)))

    关于r cumsum-like 函数,用于分割数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30841195/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com