2016-05-06 13 views
4

"a" ist eine Liste.kombinieren bestimmte Objekte in einer Liste

> a<-list(1,2,3,c(4,5),6,7) 
> a 
[[1]] 
[1] 1 

[[2]] 
[1] 2 

[[3]] 
[1] 3 

[[4]] 
[1] 4 5 

[[5]] 
[1] 6 

[[6]] 
[1] 7 

"b" ist ein Transformationsindikator.

b<-c(3,2,1) 

I Gruppe möchte (oder verbinden) Objekte in „a“ nach der Zahl in „b“, das die erste 3-Objekte Gruppe zusammen bedeutet, dann ist die nächsten zwei, schließlich das letzte, das erwartete Ergebnis ist, wie folgt:

[[1]] 
[1] 1 2 3 

[[2]] 
[1] 4 5 6 

[[3]] 
[1] 7 

kann ich nur „cumsum“ verwenden, um die drei Gruppen zusammenzufassen, aber nicht wissen, wie jedes Objekt angezeigt werden, wie oben aufgeführt. Vielen Dank.

Antwort

2

Eine weitere Option ist

lapply(split(a, cumsum(sequence(b)==1)), unlist) 
#$`1` 
#[1] 1 2 3 

#$`2` 
#[1] 4 5 6 

#$`3` 
#[1] 7 
+0

'Julius <-Funktion() tapply (a, rep (seq_along (b), b), Reduce, f = "c"); akrun <-funktion() lapply (split (a, cumsum (Sequenz (b) == 1)), unlist); identisch (Julius(), akrun()) [1] FALSCH, warum sind sie nicht gleich? – lightsnail

+0

@lightsnail Es muss wegen einiger Attribute in der 'Julius()' Ausgabe sein. Versuchen Sie 'all.equal (akrun(), Julius(), check.attributes = FALSCH) # [1] TRUE' – akrun

+0

Vielen Dank! – lightsnail

4
tapply(a, rep(seq_along(b), b), Reduce, f = `c`) 
$`1` 
[1] 1 2 3 

$`2` 
[1] 4 5 6 

$`3` 
[1] 7 
1

Ein weiterer Versuch:

grps <- rep(rep(seq_along(b), b), lengths(a)) 
relist(unlist(a), split(grps,grps)) 

#$`1` 
#[1] 1 2 3 
# 
#$`2` 
#[1] 4 5 6 
# 
#$`3` 
#[1] 7 
Verwandte Themen