2016-04-14 2 views
1

Как я могу подсчитать элементы в рекурсивном списке? Вот данные, но это может быть больший список.Количество элементов в рекурсивном списке

data <- list(list(list("a"), list("b"), list("c","d","e")), list("f")) 

> str(data) 
List of 2 
$ :List of 3 
    ..$ :List of 1 
    .. ..$ : chr "a" 
    ..$ :List of 1 
    .. ..$ : chr "b" 
    ..$ :List of 3 
    .. ..$ : chr "c" 
    .. ..$ : chr "d" 
    .. ..$ : chr "e" 
$ :List of 1 
    ..$ : chr "f" 

На выходе я хочу иметь вектор с использованием%, который суммирует до 100%:

o <- c(1/2/3/1, 1/2/3/1, 1/2/3/3, 1/2/3/3, 1/2/3/3, 1/2/1) 
[1] 0.16666667 0.16666667 0.05555556 0.05555556 0.05555556 0.50000000 
sum(o) 
[1] 1 

Так что мне нужно v1 (только респ распределения = 100%):

v1 <- rep(1, length(unlist(data))) 
v1 
[1] 1 1 1 1 1 1 

v2:

> v2 <- rep(length(data), length(unlist(data))) 
> v2 
[1] 2 2 2 2 2 2 

v3,

> v3 = c(3, 3, 3, 3, 3, 1) 

v4:

v4 = с (1, 1, 3, 3, 3, 1)

т.д.

В результате:

> v1/v2/v3/v4 
[1] 0.16666667 0.16666667 0.05555556 0.05555556 0.05555556 0.50000000 
sum(v1/v2/v3/v4) 
[1] 1 

Итак, вопрос в том, как я могу сделать v3 и v4 и т. Д.?

Может быть, есть способ получить вектор ул (данные) подсчет длины каждого ребенка, как:

out <- c("2/3/1", "2/3/1", "2/3/3", "2/3/3", "2/3/3", "2/1") 

Затем этим вектором я могу сделать математику:

> sapply(out, function(x) last(cumprod(1/c(1, as.numeric(unlist(strsplit(x, "/"))))))) 
    2/3/1  2/3/1  2/3/3  2/3/3  2/3/3  2/1 
0.16666667 0.16666667 0.05555556 0.05555556 0.05555556 0.50000000 

ответ

3

Это поддается рекурсивное решение, возможно, что-то вроде:

data <- list(list(list("a"), list("b"), list("c","d","e")), list("f")) 


f <- function(x, prop=1) 
{ 
    if(is.list(x)) lapply(x, f, prop=prop/length(x)) 
    else prop/length(x) 
} 

unlist(f(data)) 

#[1] 0.16666667 0.16666667 0.05555556 0.05555556 0.05555556 0.50000000