2015-10-05 48 views
0

我有一个向量,说f1为变量no分割一个向量。的时间成嵌套向量

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函数被执行用于任意级别的嵌套?

编辑:按照评论中的要求,我给整个事情想要的最终结果如下。

[[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中对其进行排序。)

+2

我只有一个问题。为什么? –

+0

因为我在其他一些工作中需要这个。 – nb1

回答

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中列表的构造。

+0

非常感谢!我在使用递归函数thingy时遇到了麻烦,所以很茫然。再次感谢您的解决方案! – nb1