【问题标题】:How do I split a vector into a list of vectors when a condition is met?满足条件时如何将向量拆分为向量列表?
【发布时间】:2014-08-20 18:10:35
【问题描述】:

我想将一个向量拆分成一个向量列表。生成的向量将是可变长度的,我需要仅在满足某些条件时才进行拆分。

样本数据:

set.seed(3)
x <- sample(0:9,100,repl=TRUE)

例如,在这种情况下,我想将上述向量 x 拆分为每个 0。

目前我用自己的函数来做这个:

ConditionalSplit <- function(myvec, splitfun) {
  newlist <- list()
  splits <- which(splitfun(x))
  if (splits == integer(0)) return(list(myvec))
  if (splits[1] != 1) newlist[[1]] <- myvec[1:(splits[1]-1)]
  i <- 1
  imax <- length(splits)

  while (i < imax) {
    curstart <- splits[i]
    curend <- splits[i+1]
    if (curstart != curend - 1)
      newlist <- c(newlist, list(myvec[curstart:(curend-1)]))
    i <- i + 1
  }

  newlist <- c(newlist, list(myvec[splits[i]:length(vector)]))
  return(newlist)
}

这个函数给出了我想要的输出,但我确信有比我更好的方法。

> MySplit <- function(x) x == 0

> ConditionalSplit(x, MySplit)

[[1]]
 [1] 1 8 3 3 6 6 1 2 5 6 5 5 5 5 8 8 1 7 8 2 2

[[2]]
[1] 0 1

[[3]]
 [1] 0 2 7 5 9 5 7 3 3 1 4 2 3 8 2 5 2 2 7 1 5 4 2
...

【问题讨论】:

  • 喜欢这个split(x,cumsum(x==0))?
  • 完美运行。谢谢!

标签: r split


【解决方案1】:

以下行似乎可以正常工作:

split(x,cumsum(x==0))

【讨论】:

  • 我真的很喜欢这种“布尔向量的累积和”技巧。谢谢。 (+1)
  • 这太棒了@vincent-guillemot。我想这样做是为了将字符串向量拆分为一个列表,基于每次字符“#”出现在向量中。我修改了您的线路:split(a, cumsum(1:length(a) %in% grep("#", a)))
【解决方案2】:

另一种解决方案是使用tapply。使用 tapply 而不是 split 的一个很好的理由是,它允许您在拆分时对列表中的项目执行其他操作。

例如,在这个问题的解决方案中:

> x <- sample(0:9,100,repl=TRUE)
> idx <- cumsum(x==0)
> splitList <- tapply(x, idx, function(y) {list(y)})
> splitList
$`0`
[1] 2 9 2

$`1`
[1] 0 5 5 3 8 4

$`2`
[1] 0 2 5 2 6 2 2

$`3`
[1] 0 8 1 7 5

$`4`
 [1] 0 1 6 6 3 8 7 2 4 2 3 1

$`5`
[1] 0 6 8 9 9 1 1 2

$`6`
 [1] 0 1 2 2 2 7 8 1 9 7 9 3 4 8 4 6 4 5 3 1

$`7`
[1] 0 2 7 8 5

$`8`
[1] 0 3 4 8 4 7 3

$`9`
[1] 0 8 4

$`10`
 [1] 0 4 3 9 9 8 7 4 4 5 5 1 1 7 3 9 7 4 4 7 7 6 3 3

可以修改,以便将每个元素除以该列表中的元素数。

list(y/length(y))

而不是

list(y)

【讨论】:

    猜你喜欢
    • 2021-01-04
    • 2021-12-06
    • 2014-02-18
    • 2021-08-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多