我有一个矢量x

x = c(1, 1, 2.00005, 1, 1, 0, 0, 0, 0, 1, 2, 0, 3, 4, 0, 0, 0, 0, 1, 2, 3, 1, 3)

我需要将由n(在这种情况下,假设n3)或多个零分隔的值分成不同的组。

所需的输出将是
list(x1 = c(1, 1, 2.00005, 1, 1),
     x2 = c(1, 2, 0, 3, 4),
     x3 = c(1, 2, 3, 1, 3))
#$x1
#[1] 1.00000 1.00000 2.00005 1.00000 1.00000

#$x2
#[1] 1 2 0 3 4

#$x3
#[1] 1 2 3 1 3

以下内容不起作用,因为即使组中的x零个数少于零,它也会拆分n
temp = cumsum(x == 0)
split(x[x!=0], temp[x!=0])
#$`0`
#[1] 1.00000 1.00000 2.00005 1.00000 1.00000

#$`4`
#[1] 1 2

#$`5`
#[1] 3 4

#$`9`
#[1] 1 2 3 1 3

最佳答案

这是我的尝试。此方法用NA替换长度小于或等于3的零游程。由于使用split()时不适用NA,因此我们得到了所需的输出。

x <- c(1, 1, 2.00005, 1, 1, 0, 0, 0, 0, 1, 2, 0, 3, 4, 0, 0, 0, 0, 1, 2, 3, 1, 3)

ll <- with(rle(x == 0), {
  ifelse(x == 0 & (seq_along(x) != cumsum(lengths)[lengths <= 3 & values]), NA, x)
})

split(x, with(rle(is.na(ll)), rep(1:length(lengths), lengths) + ll * 0))
# $`1`
# [1] 1.00000 1.00000 2.00005 1.00000 1.00000
#
# $`3`
# [1] 1 2 0 3 4
#
# $`5`
# [1] 1 2 3 1 3

10-06 01:46