2015-10-05 52 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