如何根据值的数字顺序拆分列表?
How do you split lists according to numerical order of values?
我正在尝试将数字列表动态拆分为单独的向量,按顺序排列。
假设有一些数字向量
Numbers_set1 <- c(53,54,55,56,58,59)
Numbers_set2 <- c(52,57)
我想像这样根据连续的顺序将它们分成不同的向量
# so this is what each group would look like but done dynamically
Numbers_set1_group1 <- c(53,54,55,56)
Numbers_set1_group2 <- c(58,59)
Numbers_set2_group1 <- c(52)
Numbers_set2_group2 <- c(57)
我正在尝试动态执行此操作。
另一个例子
Numbers_set1 <- c(53,54,55,56,58,59,61,62,63)
Numbers_set2 <- c(52,57,60,64)
Numbers_set1_group1 <- c(53,54,55,56)
Numbers_set1_group2 <- c(58,59)
Numbers_set1_group3<- c(61,62,63)
Numbers_set2_group1 <- c(52)
Numbers_set2_group2 <- c(57)
Numbers_set2_group3<- c(60)
Numbers_set2_group4<- c(64)
向量的数量可能会有所不同,具体取决于顺序排列的数字数量。
也许用 i
指定每个子列表?
谢谢!
您可以将 split
与 lapply
一起使用:
Numbers_set1 <- c(53,54,55,56,58,59)
Numbers_set2 <- c(52,57)
lapply(list(Numbers_set1, Numbers_set2), \(x) split(x, cumsum(c(1, diff(x) != 1))))
如果你也想复制名称,可以使用imap
和lst
,然后将列表的对象发送到Global environment
和list2env
.
library(tidyverse)
l <- imap(lst(Numbers_set1, Numbers_set2),
~ split(.x, paste0("group", cumsum(c(1, diff(.x) != 1)))))
l <- unlist(l, recursive = F)
l
#$Numbers_set1.group1
#[1] 53 54 55 56
#
#$Numbers_set1.group2
#[1] 58 59
#
#$Numbers_set2.group1
#[1] 52
#
#$Numbers_set2.group2
#[1] 57
list2env(l, envir = .GlobalEnv)
为了完整起见,DescTools
包中的 SplitAt()
函数在给定位置将向量拆分为多个部分。
v <- c(53,54,55,56,58,59,61,62,63, 65)
l <- DescTools::SplitAt(v, which(diff(v) > 1) + 1)
l
[[1]]
[1] 53 54 55 56
[[2]]
[1] 58 59
[[3]]
[1] 61 62 63
[[4]]
[1] 65
由于 l
是一个列表,您可以通过它的索引号检索每个子列表,例如,
l[[3]]
[1] 61 62 63
我正在尝试将数字列表动态拆分为单独的向量,按顺序排列。
假设有一些数字向量
Numbers_set1 <- c(53,54,55,56,58,59)
Numbers_set2 <- c(52,57)
我想像这样根据连续的顺序将它们分成不同的向量
# so this is what each group would look like but done dynamically
Numbers_set1_group1 <- c(53,54,55,56)
Numbers_set1_group2 <- c(58,59)
Numbers_set2_group1 <- c(52)
Numbers_set2_group2 <- c(57)
我正在尝试动态执行此操作。
另一个例子
Numbers_set1 <- c(53,54,55,56,58,59,61,62,63)
Numbers_set2 <- c(52,57,60,64)
Numbers_set1_group1 <- c(53,54,55,56)
Numbers_set1_group2 <- c(58,59)
Numbers_set1_group3<- c(61,62,63)
Numbers_set2_group1 <- c(52)
Numbers_set2_group2 <- c(57)
Numbers_set2_group3<- c(60)
Numbers_set2_group4<- c(64)
向量的数量可能会有所不同,具体取决于顺序排列的数字数量。
也许用 i
指定每个子列表?
谢谢!
您可以将 split
与 lapply
一起使用:
Numbers_set1 <- c(53,54,55,56,58,59)
Numbers_set2 <- c(52,57)
lapply(list(Numbers_set1, Numbers_set2), \(x) split(x, cumsum(c(1, diff(x) != 1))))
如果你也想复制名称,可以使用imap
和lst
,然后将列表的对象发送到Global environment
和list2env
.
library(tidyverse)
l <- imap(lst(Numbers_set1, Numbers_set2),
~ split(.x, paste0("group", cumsum(c(1, diff(.x) != 1)))))
l <- unlist(l, recursive = F)
l
#$Numbers_set1.group1
#[1] 53 54 55 56
#
#$Numbers_set1.group2
#[1] 58 59
#
#$Numbers_set2.group1
#[1] 52
#
#$Numbers_set2.group2
#[1] 57
list2env(l, envir = .GlobalEnv)
为了完整起见,DescTools
包中的 SplitAt()
函数在给定位置将向量拆分为多个部分。
v <- c(53,54,55,56,58,59,61,62,63, 65)
l <- DescTools::SplitAt(v, which(diff(v) > 1) + 1)
l
[[1]] [1] 53 54 55 56 [[2]] [1] 58 59 [[3]] [1] 61 62 63 [[4]] [1] 65
由于 l
是一个列表,您可以通过它的索引号检索每个子列表,例如,
l[[3]]
[1] 61 62 63