在R:帮助在数据帧中使用rle()函数

时间:2013-12-31 18:29:17

标签: r

我试图找到超过1M obs的数据帧连续运行'1'值的次数。 11个二进制变量。我在这里看了很多类似的问题,但没有一个像我一样处理冗长的数据帧。

我可以逐行找到'1'的连续运行,但我正在寻找能够更优雅地处理整个数据帧的解决方案。

简单的示例数据:

test <- data.frame(v1=c(1,0,1),v2=c(1,1,1),v3=c(0,1,1),v4=c(1,1,0),v5=c(1,1,1))
test
vtest <- as.vector(test[1,])
vtest

r <- rle(vtest)
r$length[r$values ==1]
row1_max <- lapply(r$length[r$values ==1], FUN=max)
row1_max

对于我来说,找到数据帧每行最多连续运行'1'的最佳方法是什么,而不必逐行找到每一行?

我的真实数据集还包含一个ID#变量,它唯一地标识每条记录,我最终想知道ID#的最大连续运行次数,所以任何额外的帮助都会非常感激。

提前致谢!

3 个答案:

答案 0 :(得分:4)

您可以使用apply将函数应用于数据框的每一行:

apply(test, 1, function(x) {
  r <- rle(x)
  max(r$lengths[as.logical(r$values)])
})

这将返回每行连续1的最大连续数:

[1] 2 4 3

答案 1 :(得分:0)

我会使用申请家庭的组合

library(dplyr) apply(test, 1, rle) %>% lapply(function(x) x$lengths) %>% vapply(max, numeric(1))

[1] 2 4 3

答案 2 :(得分:0)

我假设您的df整洁,并且二进制文件在列中

set.seed(1)
event <- sample(1:3,365*3,replace=TRUE) # proxy for one of your columns
runs <- rle(event)
sum(runs$lengths >= 6 & runs$values == 1)
[1] 2

我目前正在寻找6个或更多个序列开始的行号