【问题标题】:Splitting a vector for variable no. of times into nested vectors为变量号拆分向量。嵌套向量的次数
【发布时间】:2015-10-05 21:19:35
【问题描述】:

我有一个向量,比如f1

f1 = c(1, 0,  0,  1,  0,  1,  1,  1,  0,  1, -6)

我想根据原始列表中 1 的位置,将此向量拆分为一个嵌套列表,如下所示。相同的R代码如下:

dfg <- function(f1) {
  df<-which(f1 %in% 1)
  m<-c()
  for(i in 1:df[2]-1) {
    m<-c(m,list(f1[i]))
  }
  m<-c(m,list(f1[df[2]:length(f1)]))
  return(m)
}

输出如下:

[[1]]
numeric(0)

[[2]]
[1] 1

[[3]]
[1] 0

[[4]]
[1] 0

[[5]]
[1]  1  0  1  1  1  0  1 -6

到目前为止一切顺利。现在注意 m[[5]] 的长度 > 1。

我想重复上面的这个过程,直到输出中每个嵌套级别的每个元素的长度都是 1。

如何确保上面列出的 R 函数可以执行任意级别的嵌套?

编辑:根据 cmets 的要求,我给出了整个事情的预期最终结果,如下所示。

[[1]] 数字(0)

[[2]] [1] 1

[[3]] [1] 0

[[4]] [1] 0

[[5]]

[[5]][[1]] 数字(0)

[[5]][[2]] [1] 1

[[5]][[3]] [1] 0

[[5]][[4]]

[[5]][[4]][[1]] 数字(0)

[[5]][[4]][[2]] [1] 1

[[5]][[4]][[3]]

[[5]][[4]][[3]][[1]] 数字(0)

[[5]][[4]][[3]][[2]] [1] 1

[[5]][[4]][[3]][[3]]

[[5]][[4]][[3]][[3]][[1]] 数字(0)

[[5]][[4]][[3]][[3]][[2]] [1] 1

[[5]][[4]][[3]][[3]][[3]] [1] 0

[[5]][[4]][[3]][[3]][[4]] [1] 1 -6

(我知道最后一个元素的长度是 2,而不是 1。但这对我来说不是问题。我将在函数 dfg 中对其进行排序。)

【问题讨论】:

  • 我只有一个问题。为什么?
  • 因为我在其他工作中需要这个。

标签: r list nested


【解决方案1】:

虽然你为什么想要这个嵌套结构对我来说有点神秘,但我能想到的最自然的构造方法是使用递归函数:

f1 = c(1, 0,  0,  1,  0,  1,  1,  1,  0,  1, -6)
dfg <- function(f1) {
  df <- which(f1 == 1)
  if (length(df) <= 1) f1
  else c(list(numeric(0)), as.list(f1[1:(df[2]-1)]), list(dfg(f1[df[2]:length(f1)])))
}

dfg(f1)
# [[1]]
# numeric(0)
# 
# [[2]]
# [1] 1
# 
# [[3]]
# [1] 0
# 
# [[4]]
# [1] 0
# 
# [[5]]
# [[5]][[1]]
# numeric(0)
# 
# [[5]][[2]]
# [1] 1
# 
# [[5]][[3]]
# [1] 0
# 
# [[5]][[4]]
# [[5]][[4]][[1]]
# numeric(0)
# 
# [[5]][[4]][[2]]
# [1] 1
# 
# [[5]][[4]][[3]]
# [[5]][[4]][[3]][[1]]
# numeric(0)
# 
# [[5]][[4]][[3]][[2]]
# [1] 1
# 
# [[5]][[4]][[3]][[3]]
# [[5]][[4]][[3]][[3]][[1]]
# numeric(0)
# 
# [[5]][[4]][[3]][[3]][[2]]
# [1] 1
# 
# [[5]][[4]][[3]][[3]][[3]]
# [1] 0
# 
# [[5]][[4]][[3]][[3]][[4]]
# [1]  1 -6

请注意,我利用as.list(1:3) 等同于list(1, 2, 3) 的事实来简化dfg 中列表的构造。

【讨论】:

  • 谢谢一百万!我在使用递归函数时遇到了麻烦,所以不知所措。再次感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多