3

我在 R 中有以下数值列表:

sales_by_hour = c(130, 21, 0, 0, 0, 0, 6, 244, 391, 408, 431, 0, 0, 471, 
                  530, 573, 643, 643, 667, 787, 990, 1024, 1012, 712)

然后我应用了以下代码来获取最小值的索引

which(test2==0)

返回值c(3,4,5,6,12,13)。但是,我想再次将此列表拆分为 2 个或更多列表。c(3,4,5,6)并且c(12,13),因为我想分隔非连续的数字系列。

4

2 回答 2

3

它可以在base

split(which(sales_by_hour==0), cumsum(c(1, diff(which(sales_by_hour==0)) != 1)))

#> $`1`
#> [1] 3 4 5 6
#> 
#> $`2`
#> [1] 12 13
于 2019-08-13T17:27:14.293 回答
1

1) rleid使用最后Note中的输入,我们可以使用rleidfrom data.table。它为输入中的每次运行分配一个唯一编号,从而形成一个紧凑的解决方案。

library(data.table)
split(seq_along(x)[x == 0], rleid(x)[x == 0])

给予:

$`3`
[1] 3 4 5 6

$`9`
[1] 12 13

2)碱基R这也可以在碱基中完成,但代价是稍长的解决方案。这里的值与inverse.rle(r)的值相同, rleid(x)并且在不使用任何包的情况下完成。

r <- rle(x)
r$values <- seq_along(r$values)
split(seq_along(x)[x == 0], inverse.rle(r)[x == 0])

笔记

可重现形式的输入:

Line <- "130   21    0    0    0    0    6  244  391  408  431  0  0  471  530  573  643  643  667  787  990 1024 1012  712"
x <- scan(text = Line)
于 2019-08-13T17:25:04.323 回答