【问题标题】:Finding the start and end of a sequence in a data.frame在 data.frame 中查找序列的开始和结束
【发布时间】:2012-04-16 14:35:15
【问题描述】:

我有一个很长的数据框,我想找到一个序列的结尾和开头。为了简化

b = c("a","c","a","c","e", "a","c","a","c","a" ,"c","a","c","a","c" ,"d","d","d","d","d")
a = c(0,0,0,0,1, 4,0,0,0,0, 5,1,6,0,0, 0,10,0,0,0)
df = data.frame(a,b)

我想要的是找到所有非零到 0 和 0 到非零转换的方法。

我通过使用lapply 调用函数并保存上一次调用的值来完成此操作。

我正在寻找更优雅的东西,可以让我查看第 N 行和第 N+1 行,或者更好的是我的函数中的第 N 行到第 N+M 行,或者更好的东西。

【问题讨论】:

  • 您可以通过rle(Data$a==0) 找到它们,但根据您的最终目标,可能有更有用的方式来对序列进行分组。
  • 详细说明 Joshua 的评论:Data$a==0 为 0 返回逻辑 1,为其他所有内容返回逻辑 0,从而使 rle 的输出完全符合您的要求。

标签: r dataframe


【解决方案1】:

也许这就是你想要的?它可能不优雅,但它应该检测到您描述的转换。

> lagn <- function(x, n) { c(rep(NA,n), x[1:(length(x)-n)]) }
> df$c <- lagn(df$a, 1)
# mult ensures one of the item is zero, add ensures one of the item was nonzero
> df[which( (df$a*df$c)==0 & (df$a+df$c)!=0),]
    a b  c
5   1 e  0
7   0 c  4
11  5 c  0
14  0 a  6
17 10 d  0
18  0 d 10

【讨论】:

    猜你喜欢
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-18
    • 2022-01-10
    • 2021-01-25
    • 1970-01-01
    相关资源
    最近更新 更多