Dear R gurus,
first let me apologize for a question that might hve been answered
before. I was not able to find the solution yet. I want to concatenate
two lists of lists at their lowest level.
Suppose I have two lists of lists:
list.1 <- list("I"=list("A"=c("a",
"b", "c"), "B"=c("d", "e",
"f")),
"II"=list("A"=c("g", "h",
"i"), "B"=c("j", "k", "l")))
list.2 <- list("I"=list("A"=c("A",
"B", "C"), "B"=c("D", "E",
"F")),
"II"=list("A"=c("G", "H",
"I"), "B"=c("J", "K", "L")))
> list.1
$I
$I$A
[1] "a" "b" "c"
$I$B
[1] "d" "e" "f"
$II
$II$A
[1] "g" "h" "i"
$II$B
[1] "j" "k" "l"
> list.2
$I
$I$A
[1] "A" "B" "C"
$I$B
[1] "D" "E" "F"
$II
$II$A
[1] "G" "H" "I"
$II$B
[1] "J" "K" "L"
Now I want to concatenate list elements of the lowest levels, so the
result looks like this:
$I
$I$A
[1] "a" "b" "c" "A" "B"
"C"
$I$B
[1] "d" "e" "f" "D" "E"
"F"
$II
$II$A
[1] "g" "h" "i" "G" "H"
"I"
$II$B
[1] "j" "k" "l" "J" "K"
"L"
Has anybody a good solution for that?
Best,
Georg
Hi Georg,
This was an interesting challenge to me. Here's what I came up with.
The first option meets your desired result, but could get messy with
deeper nesting. The second is less code, but is not quite what you
want and requires as.data.frame() to give a reasonable result for each
list. Calling either option a "good solution" would be rather
generous. I'm iinterested to see what other people do.
Josh
## Data
list.1 <- list("I"=list("A"=c("a",
"b", "c"), "B"=c("d", "e",
"f")),
"II"=list("A"=c("g", "h",
"i"), "B"=c("j", "k", "l")))
list.2 <- list("I"=list("A"=c("A",
"B", "C"), "B"=c("D", "E",
"F")),
"II"=list("A"=c("G", "H",
"I"), "B"=c("J", "K", "L")))
## Try 1
list.t1 <- list.1
for(i in length(list.1)) {
for(j in length(list.1[[i]])) {
list.t1[[c(i, j)]] <- c(list.1[[c(i, j)]], list.2[[c(i, j)]])
}
}
## Try 2
list.t2 <- as.list(do.call("rbind", lapply(list(list.1, list.2),
as.data.frame, stringsAsFactors = FALSE)))
## Results
list.t1
list.t2
On Tue, Jan 11, 2011 at 7:44 AM, Georg Otto <gwo at well.ox.ac.uk>
wrote:> Dear R gurus,
>
>
> first let me apologize for a question that might hve been answered
> before. I was not able to find the solution yet. I want to concatenate
> two lists of lists at their lowest level.
>
> Suppose I have two lists of lists:
>
> list.1 <- list("I"=list("A"=c("a",
"b", "c"), "B"=c("d", "e",
"f")),
>
> ? ? ? ? ? ? ? "II"=list("A"=c("g",
"h", "i"), "B"=c("j", "k",
"l")))
>
>
> list.2 <- list("I"=list("A"=c("A",
"B", "C"), "B"=c("D", "E",
"F")),
>
> ? ? ? ? ? ? ? "II"=list("A"=c("G",
"H", "I"), "B"=c("J", "K",
"L")))
>
>
>
>> list.1
> $I
> $I$A
> [1] "a" "b" "c"
>
> $I$B
> [1] "d" "e" "f"
>
>
> $II
> $II$A
> [1] "g" "h" "i"
>
> $II$B
> [1] "j" "k" "l"
>
>
>> list.2
> $I
> $I$A
> [1] "A" "B" "C"
>
> $I$B
> [1] "D" "E" "F"
>
>
> $II
> $II$A
> [1] "G" "H" "I"
>
> $II$B
> [1] "J" "K" "L"
>
>
> Now I want to concatenate list elements of the lowest levels, so the
> result looks like this:
>
>
> $I
> $I$A
> [1] "a" "b" "c" "A" "B"
"C"
>
> $I$B
> [1] "d" "e" "f" "D" "E"
"F"
>
>
> $II
> $II$A
> [1] "g" "h" "i" "G" "H"
"I"
>
> $II$B
> [1] "j" "k" "l" "J" "K"
"L"
>
>
> Has anybody a good solution for that?
>
> Best,
>
> Georg
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>
--
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
http://www.joshuawiley.com/
On Tue, 11 Jan 2011, Georg Otto wrote:> Dear R gurus, > > > first let me apologize for a question that might hve been answered > before. I was not able to find the solution yet. I want to concatenate > two lists of lists at their lowest level. > > Suppose I have two lists of lists: > > list.1 <- list("I"=list("A"=c("a", "b", "c"), "B"=c("d", "e", "f")), > > "II"=list("A"=c("g", "h", "i"), "B"=c("j", "k", "l"))) > > > list.2 <- list("I"=list("A"=c("A", "B", "C"), "B"=c("D", "E", "F")), > > "II"=list("A"=c("G", "H", "I"), "B"=c("J", "K", "L"))) > > > >> list.1 > $I > $I$A > [1] "a" "b" "c" > > $I$B > [1] "d" "e" "f" > > > $II > $II$A > [1] "g" "h" "i" > > $II$B > [1] "j" "k" "l" > > >> list.2 > $I > $I$A > [1] "A" "B" "C" > > $I$B > [1] "D" "E" "F" > > > $II > $II$A > [1] "G" "H" "I" > > $II$B > [1] "J" "K" "L" > > > Now I want to concatenate list elements of the lowest levels, so the > result looks like this: > > > $I > $I$A > [1] "a" "b" "c" "A" "B" "C" > > $I$B > [1] "d" "e" "f" "D" "E" "F" > > > $II > $II$A > [1] "g" "h" "i" "G" "H" "I" > > $II$B > [1] "j" "k" "l" "J" "K" "L" > > > Has anybody a good solution for that? >> mapply( function(x,y) mapply(c, x, y, SIMPLIFY=FALSE),+ list.1, list.2, SIMPLIFY=FALSE ) $I $I$A [1] "a" "b" "c" "A" "B" "C" $I$B [1] "d" "e" "f" "D" "E" "F" $II $II$A [1] "g" "h" "i" "G" "H" "I" $II$B [1] "j" "k" "l" "J" "K" "L" HTH, Chuck>> Best, > > Georg > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >Charles C. Berry Dept of Family/Preventive Medicine cberry at tajo.ucsd.edu UC San Diego http://famprevmed.ucsd.edu/faculty/cberry/ La Jolla, San Diego 92093-0901
Without any error checking, I'd try this:
recurse <-
function(l1,l2){
if(is(l1[[1]],"list"))
mapply(recurse,l1,l2,SIMPLIFY=F) else
{mapply(c,l1,l2,SIMPLIFY=F)}
}
recurse(list.1,list.2)
which recursively traverses each tree (list) in tandem until one is not
composed of lists and then concatenates. If the structure of the lists does
not agree, this will fail.
Regards,
David Katz
david at davidkatzconsulting.com
--
View this message in context:
http://r.789695.n4.nabble.com/list-concatenation-tp3209182p3209324.html
Sent from the R help mailing list archive at Nabble.com.