【发布时间】:2013-03-01 04:56:08
【问题描述】:
我有一个非常大的 data.frame(实际上是一个 data.table)。现在,为了简化事情,假设我的 data.frame 如下:
x <- c(1, 1, 0, 0, 1, 0, 0, NA, NA, 0)
y <- c(1 ,0 ,NA, NA, 0, 0, 0, 1, 1, 0)
mydf <- data.frame(rbind(x,y))
我想确定最后一个序列在哪一行(如果有)由三个连续的零组成,不考虑 NA。因此,在上面的示例中,第一行在最后一个序列中有三个连续的零,但第二个没有。
只要我有一个向量(不是 data.frame),我就知道该怎么做:
runs <- rle(x[is.na(x)==F])
runs$lengths[length(runs$lengths)] > 2 & runs$values[length(runs$lengths)]==0
我显然可以做一个循环,我会得到我想要的。但这会非常低效,而且我的实际 data.frame 非常大。那么,关于如何以最快的方式完成的任何想法?
我想 apply 可能有用,但我现在无法考虑使用它。另外,也许有一种 data.table 方法可以做到这一点?
ps.:实际上,这个 data.frame 是我原来的 data.table 的改版版本。如果我能以某种方式使用原始格式的 data.frame 完成这项工作,那没关系。要查看我的 data.frame 最初如何,只需将其视为:
x <- c(1, 1, 0, 0, 1, 0, 0, 0)
y <- c(1 ,0 , 0, 0, 0, 1, 1, 0)
myOriginalDf <- data.frame(value=c(x,y), id=rep(c('x','y'), c(length(x), length(y))))
【问题讨论】:
-
处理 data.table 中的多个列效率会很低,因此您的原始宽 data.frame 对您的示例不是特别有用
标签: r data.table