[R] Append selectively to components of a list

jim holtman jholtman at gmail.com
Sat Sep 27 21:01:20 CEST 2008


Is this what you want:

> l <- list(a=c(1), b=c(2,3), c=c(4,5,6))
> l
$a
[1] 1

$b
[1] 2 3

$c
[1] 4 5 6

> l$b <- c(l$b, 99)
> l
$a
[1] 1

$b
[1]  2  3 99

$c
[1] 4 5 6

>

Or is you want to dynamically specify the list element:

> x <- 'a'
> l[[x]] <- c(l[[x]], -99)
> l
$a
[1]   1 -99

$b
[1]  2  3 99

$c
[1] 4 5 6



On Sat, Sep 27, 2008 at 2:44 PM, Bodea, Tudor D <gtg757i at mail.gatech.edu> wrote:
> Dear R users:
>
> Is there a way to append selectively to components of a list (if possible, loops are to be avoided)? To illustrate the point, in the example below, I would like to append 99 to vector b of the list l.
>
>> l <- list(a=c(1), b=c(2,3), c=c(4,5,6))
>> l
> $a
> [1] 1
>
> $b
> [1] 2 3
>
> $c
> [1] 4 5 6
>
> As you may expect, the result should look like:
>
>> l
> $a
> [1] 1
>
> $b
> [1] 2 3 99
>
> $c
> [1] 4 5 6
>
> I believe that a combination of match and lapply will do it, but, unfortunately, it seems that I cannot get it right.  lapply alone will append the 99 to all vectors in l.  Trying to somehow subset with match gives me the result expected but in a form independent of the original list (see below). I think that match should appear inside the lapply function but, for now, I just cannot make it work.
>
>> lapply(l, function(x, y) {x<-c(x,y)}, y=99)
> $a
> [1]  1 99
>
> $b
> [1]  2  3 99
>
> $c
> [1]  4  5  6 99
>
>> lapply(l[match("b", names(l))], function(x,y) x <- c(x,y), y=99)
> $b
> [1]  2  3 99
>
> I use R2.7.1 on a Windows machine. Thank you so much.
>
> Tudor
>
> ______________________________________________
> 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.
>



-- 
Jim Holtman
Cincinnati, OH
+1 513 646 9390

What is the problem that you are trying to solve?



More information about the R-help mailing list