我很确定你们都同意rle是R中的那些“陷阱”函数之一。是否有任何类似的函数可以“捕获”相邻整数值的“运行”?

所以,如果我有一个像这样的矢量:

x <- c(3:5, 10:15, 17, 22, 23, 35:40)

我称之为深奥的功能,我会得到这样的响应:

lengths: 3, 6, 1, 2, 6
values: (3,4,5), (10,11,12... # you get the point

编写这样的函数并不难,但仍然......任何想法?

===============>>#1 票数:8 已采纳

1)根据值计算值然后计算长度

s <- split(x, cumsum(c(0, diff(x) != 1)))
run.info <- list(lengths = unname(sapply(s, length)), values = unname(s))

使用问题中的x运行它会给出:

> str(run.info)
List of 2
 $ lengths: int [1:5] 3 6 1 2 6
 $ values :List of 5
  ..$ : num [1:3] 3 4 5
  ..$ : num [1:6] 10 11 12 13 14 15
  ..$ : num 17
  ..$ : num [1:2] 22 23
  ..$ : num [1:6] 35 36 37 38 39 40

2)根据长度计算长度,然后计算值

这是基于Gregor长度计算的第二种解决方案:

lens <- rle(x - seq_along(x))$lengths 
list(lengths = lens, values = unname(split(x, rep(seq_along(lens), lens))))

3)计算长度和值而不使用其他

这个似乎效率低下,因为它从头开始计算每个lengthsvalues ,它似乎有点过于复杂,但它确实设法将它全部归结为一个语句,所以我想我也会添加它。 它基本上只是上面标记为1)和2)的前两个解决方案的混合。 没有什么比这两个更新的了。

list(lengths = rle(x - seq_along(x))$lengths,
           values = unname(split(x, cumsum(c(0, diff(x) != 1)))))

编辑:添加第二个解决方案。

编辑:添加第三个解决方案。

===============>>#2 票数:6

怎么样

rle(x - 1:length(x))$lengths   
# 3 6 1 2 6

长度是你想要的长度,虽然我用一种同样聪明的方式来获得正确的值,但是使用cumsum()和原始的x它们是非常容易接近的。

===============>>#3 票数:5

正如你所说,写一些类似于rle东西很容易。 实际上,通过添加+ 1来调整rle的代码可能会给出类似的结果

rle_consec <- function(x)
{
    if (!is.vector(x) && !is.list(x))
        stop("'x' must be an atomic vector")
    n <- length(x)
    if (n == 0L)
    return(structure(list(lengths = integer(), values = x),
             class = "rle_consec"))
    y <- x[-1L] != x[-n] + 1
    i <- c(which(y | is.na(y)), n)
    structure(list(lengths = diff(c(0L, i)), values = x[i]),
              class = "rle_consec")
}

并使用你的例子

> x <- c(3:5, 10:15, 17, 22, 23, 35:40)
> rle_consec(x)
$lengths
[1] 3 6 1 2 6

$values
[1]  5 15 17 23 40

attr(,"class")
[1] "rle_consec"

这是约翰所期望的。

您可以进一步调整代码,以给出每个连续子序列的第一个而不是最后一个。

===============>>#4 票数:2

我最近在这里发布了我的seqle代码,基于此处发布的代码,甚至是:-)。

您可以在随后的整数序列的检测间隔找到它

  ask by aL3xa translate from so

未解决问题?本站智能推荐:

5回复

r中的rle函数用于组

以下是我的数据的样子。 我正在使用Rle函数来计算我的值中的一致性,但无法应用组逻辑。 我试过循环功能,但它没有用。 我正在寻找下面的输出
2回复

R与rle函数聚合

挣扎着这个: 样本数据 : 如何按周分组这些数据并应用rle函数? 预期产出将是: 到目前为止尝试过: 给我一个列表(正如预期的那样)然后我可以计算并尝试获得预期的输出。 但我确信有一种更清洁的方法来实现这一点......任何想法? 谢谢你的期待!
1回复

rollapply与函数rle(x)

我有时间序列数据作为data.table类,每列(观察点)都有我想在滑动窗口(30宽度)内计算它们的值。 我试图使用rle(sort(x))来计算rollapply中的每个值,但它不起作用。 例如,如果我有如下表, 我试过这个; 但结果却没有意义。 请给我一些方向...
1回复

类似于pthread的函数

我想用R做一些多线程。我已经习惯了C pthread功能。 我想做的是: 这两个函数fun1和fun2是完全独立的,我认为使用fork()是不合适的,因为我想在完成下一步之前等待所有线程完成。 得到2个函数fun1和fun2 。
1回复

类似于dplyr :: distinct的函数

我有一个带有x,y位置(以像素为单位)的点的数据框,并想过滤掉所有+/- 5像素的点。 是否有类似于dplyr :: distinct()的函数,但有一个截止值。 示例数据集: X.1 XY 1637614 2559503 3601459 4601459 560
1回复

函数类似于head()的矩阵

我正在寻找可以打印矩阵的任何程序包中的函数[1:5,1:5]。 head()对于那些只有很少的列但没有大矩阵的对象是好的。 我知道我可以为此创建自己的函数,但是我想知道是否已经有一个函数。
1回复

类似于文本到列的独立整数

我是SAS世界中的R的新手,我有一个来自旧数据库的txt文件,我正在将其转换为更用户友好的csv文件进行分析,我剥离了分页并将其产品名称使用Zoo移到矩阵的列中,我试图将由空格分隔的整数分成各个列。 我试过strsplit,gsub删除空格后的整数等 data_19_3$sale =
2回复

在R中使用rle简化lapply函数

在R中,请考虑以下示例列表: 我有一个向量列表,我想做的是找到一行中大于120且小于120的最大整数。这将输出两个单独的列表,一个用于GOOD(<120),另一个用于对于BAD(> 120)。 因此,理想的GOOD输出(连续最大<120)如下所示: 和BA
2回复

使用dplyr时,使用rle按运行分组

在R中,我想在基于变量x的运行对数据进行分组之后总结我的数据( x每组数据对应于连续x值相同的数据的子集)。 例如,考虑以下数据框,我想在每次运行x计算平均y值: 在此示例中, x变量的长度为3,然后是2,然后是1,最后是1,在这四次运行中取值1,2,1和2。 这些组中y的相应平均值
3回复

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

我试图从超过1M obs的数据框中找到连续运行的'1'值的数量。 11个二进制变量。 我在这里看过许多类似的问题,但是没有一个像我的那样处理冗长的数据帧。 我可以逐行逐行找到连续的“ 1”,但我正在寻找一种可以更优雅地处理整个数据帧的解决方案。 简单的示例数据: 对于我的